VisualStateManager不能在通用应用中工作

本文关键字:应用 工作 不能 VisualStateManager | 更新日期: 2023-09-27 18:16:00

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

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);
    }
}

根据MSDN, GoToState方法需要将给定名称传递给VisualState。在我的例子中,有一个VisualStatex:Name="MouseOver",所以GoToState应该能够找到这个。
不幸的是,GoToState总是返回false,只有当它找不到具有给定名称的VisualState时才会发生。
我真的不知道该怎么解决这个问题。文档非常直接,网上的几个例子和我做的一样,但是他们能做到。
你能告诉我我做错了什么以及如何改正吗?

VisualStateManager不能在通用应用中工作

由于您没有显示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>