我创建了一个帮助程序类来托管自定义依赖项属性。 我创建了一个自定义的用户控件对象,该对象有些复杂,并且经常更新其布局。 我想在其中一个附加属性更改其值时触发动画。
下面是承载 DP 的帮助程序类的示例。
namespace testProject
{
public class MenuHelper : DependencyObject
{
public static readonly DependencyProperty IsMenuReversedProperty = DependencyProperty.RegisterAttached(
"IsMenuReversed",
typeof(Boolean),
typeof(MenuHelper),
new PropertyMetadata(false));
}
}
以下是我希望如何引用DP的示例:
<UserControl.Triggers>
<Trigger Property="testProject:MenuHelper.IsMenuReversed" Value="True">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Bouncy_Bar" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="-1" Duration="0:0:.002"/>
</Storyboard>
</BeginStoryboard>
</Trigger>
<Trigger Property="testProject:MenuHelper.IsMenuReversed" Value="False">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Bouncy_Bar" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:.002"/>
</Storyboard>
</BeginStoryboard>
</Trigger>
</UserControl.Triggers>
我意识到我无法执行上述代码,因为触发器集合只能容纳事件触发器。这就引出了我的问题:
这个问题的适当解决方案是什么?
我试图制作一个路由事件来通知我 IsMenuReverse 的更改,但后来意识到我无法在 xaml 中检查 DP 的当前值(据我所知)。
到目前为止,我想出的是只有两个单独的路由事件。每个州一个。 我不是这个解决方案的忠实粉丝,所以我欢迎有人可能有的任何其他反馈。
下面是带有 DP 的帮助程序类,用于触发两个不同的路由事件之一:
namespace TestProject
{
public class MenuHelper : DependencyObject
{
public static void SetIsMenuReversed(UIElement element, Boolean value)
{
if (GetIsMenuReversed(element) != value)
{
if (value == true)
element.RaiseEvent(new RoutedEventArgs(MenuHelper.MenuIsReversedEvent));
else
element.RaiseEvent(new RoutedEventArgs(MenuHelper.MenuIsNotReversedEvent));
element.SetValue(IsMenuReversedProperty, value);
}
}
public static bool GetIsMenuReversed(DependencyObject obj)
{
return (bool)obj.GetValue(IsMenuReversedProperty);
}
public static readonly RoutedEvent MenuIsReversedEvent = EventManager.RegisterRoutedEvent(
"MenuIsReversed",
RoutingStrategy.Direct,
typeof(RoutedEventHandler),
typeof(MenuHelper));
public static readonly RoutedEvent MenuIsNotReversedEvent = EventManager.RegisterRoutedEvent(
"MenuIsNotReversed",
RoutingStrategy.Direct,
typeof(RoutedEventHandler),
typeof(MenuHelper));
}
}
下面是侦听路由事件并为每个事件触发相关情节提要的 Xaml:
<UserControl.Triggers>
<EventTrigger RoutedEvent="testProject:MenuHelper.MenuIsReversed">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Bouncy_Bar" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="-1" Duration="0:0:.002"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="testProject:MenuHelper.MenuIsNotReversed">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Bouncy_Bar" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" To="1" Duration="0:0:.002"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</UserControl.Triggers>
如果您有替代解决方案,请发布:)