1

カスタム依存関係プロパティをホストするヘルパー クラスを作成しました。やや複雑で、レイアウトをかなり頻繁に更新するカスタム UserControl オブジェクトを作成しました。添付プロパティの 1 つが値を変更したときにアニメーションをトリガーしたいと思います。

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>

トリガー コレクションにはイベント トリガーしか格納できないため、上記のコードを実行できないことに気付きました。それは私の質問に私をもたらします:

この問題の適切な解決策は何ですか?

IsMenuReversed の変更を通知するために RoutedEvent を作成しようとしましたが、xaml で DP の現在の値を確認できないことに気付きました (私の知る限り)。

4

1 に答える 1

0

私がこれまでに思いついたのは、2つの別々のRoutedEventsを用意することです。州ごとに1つ。私はこのソリューションの大ファンではないので、誰かが持っているかもしれない他のフィードバックを歓迎します。

これは、2つの異なるルーティングイベントのいずれかを発生させる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 に答える