1

我创建了一个帮助类来托管自定义依赖属性。我创建了一个有点复杂的自定义 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 的当前值(据我所知)。

4

1 回答 1

0

到目前为止,我想出的是只有两个单独的 RoutedEvents。每个州一个。我不是这个解决方案的忠实拥护者,所以我欢迎有人提出任何其他反馈。

这是带有触发两个不同路由事件之一的 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>

如果您有替代解决方案,请发布它们:)

于 2012-10-15T17:12:29.957 回答