我创建了一个辅助类来托管自定义依赖项属性。我创建了一个有点复杂的自定义UserControl对象,并且经常更新它的布局。我想在其中一个附加属性更改其值时触发动画。
以下是托管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>
我意识到我无法执行上述代码,因为触发器集合只能容纳事件触发器。这让我想到了我的问题:
这个问题的适当解决方案是什么?
我试图让一个RoutedEvent告诉我IsMenuReversed的变化,但后来意识到我无法检查xaml中DP的当前值(据我所知)。
答案 0 :(得分:0)
到目前为止我想出的是只有两个独立的RoutedEvent。每个州一个。我不是这个解决方案的忠实粉丝,所以我欢迎任何其他人的反馈。
这是带有DP的Helper类,可以触发两个不同的路由事件之一:
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>
如果您有替代解决方案,请发布:)