VisualStateManager 在通用应用程序中不起作用

VisualStateManager not working in Universal App

我目前正在开发一个 Windows 通用应用程序,我定义了一个名为 IconButton

UserControl

IconButton.xaml

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="Common">
        <VisualState x:Name="MouseOver">
            <Storyboard>
                <ColorAnimation To="Red" Storyboard.TargetName="path" Storyboard.TargetProperty="(Fill).(SolidColorBrush.Color)" />
            </Storyboard>
        </VisualState>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

<Grid>
    <Path x:Name="path" Data="{x:Bind IconPathData, Mode=OneWay}" Stretch="UniformToFill" Fill="White" />
</Grid>

IconButton.xaml.cs

public sealed partial class IconButton : UserControl
{
    public static readonly DependencyProperty IconPathDataProperty = DependencyProperty.Register("IconPathData", typeof(string), typeof(IconButton), new PropertyMetadata(""));

    public string IconPathData
    {
        get { return (string)GetValue(IconPathDataProperty); }
        set { SetValue(IconPathDataProperty, value); }
    }

    public IconButton()
    {
        InitializeComponent();
    }

    private void UserControl_PointerEntered(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
    {
        VisualStateManager.GoToState(this, MouseOver.Name, true);
    }
}

根据 MSDNGoToState 方法需要 VisualState 将给定的名称传递给该方法。在我的例子中有一个 VisualStatex:Name="MouseOver" 所以 GoToState 应该能够找到它。
不幸的是,GoToState 总是 returns false,只有在找不到具有给定名称的 VisualState 时才会发生这种情况。
我真的不知道该怎么做才能解决这个问题。该文档非常简单明了,网络上的几个示例以与我相同的方式进行操作,但它们可以正常工作。
你能告诉我我做错了什么以及如何解决吗?

由于您没有显示 IconButton.xaml 的全部内容,我认为它看起来有点像:

<UserControl
    x:Class="App1.IconButton"
    ...
    PointerEntered="UserControl_PointerEntered">

    <VisualStateManager.VisualStateGroups>
        ...
    </VisualStateManager.VisualStateGroups>

    <Grid>
        <Path ... />
    </Grid>
</UserControl>

如果是这样,将 VisualStateManager 移到 Grid 中(而不是成为 UserControl 的直接子代:

<UserControl
    x:Class="App1.IconButton"
    ...
    PointerEntered="UserControl_PointerEntered">

    <Grid>
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="Common">
                <VisualState x:Name="MouseOver">
                    <Storyboard>
                        <ColorAnimation To="Red" Storyboard.TargetName="path" Storyboard.TargetProperty="(Fill).(SolidColorBrush.Color)" />
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>

        <Path x:Name="path" ... />
    </Grid>
</UserControl>