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);
}
}
根据 MSDN,GoToState
方法需要 VisualState
将给定的名称传递给该方法。在我的例子中有一个 VisualState
和 x: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>
我目前正在开发一个 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);
}
}
根据 MSDN,GoToState
方法需要 VisualState
将给定的名称传递给该方法。在我的例子中有一个 VisualState
和 x: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>