2016-04-03 14 views
0

私はフレームを持っています。私はこのラインでページを切り替える:WPF:コンテンツのルーティングイベントを変更する方法

FrameName.Content = new PageName(); 

私はコードビハインドでページが変更されている、と私はXAMLでそれをやってみたい、といない時にストーリーボードを開始します。私は次のコードを試しました:

<Frame.Triggers> 
    <EventTrigger RoutedEvent="ContentChanged"> 
     <BeginStoryboard Storyboard="{StaticResource storyboardName}" /> 
    </EventTrigger> 
</Frame.Triggers> 

ビットを検索した後、私はその性質の組み込みルーティングイベントがないことを認識しました。最初の答えhere

最もダイナミックなアプローチは、単にContentChangedイベントを提供し、独自のラベル制御を導出することであることを示唆しています。私はそれがこのようになり使用XAMLで

using System.Windows; 
using System.Windows.Controls; 

namespace ContentChangedTest 
{ 
    class MyFrame : Frame 
    { 
     public event DependencyPropertyChangedEventHandler ContentChanged; 

     static MyFrame() 
     { 
      ContentProperty.OverrideMetadata(typeof(MyFrame), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnContentChanged))); 
     } 

     private static void OnContentChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e) 
     { 
      MyFrame frame = dp as MyFrame; 

      if (frame.ContentChanged != null) 
      { 
       DependencyPropertyChangedEventArgs args = new DependencyPropertyChangedEventArgs(ContentProperty, e.OldValue, e.NewValue); 
       frame.ContentChanged(frame, args); 
      } 
     } 
    } 
} 

私はこの答えのコードを実装しようとしてい

<local:MyFrame ContentChanged="MyFrame_ContentChanged" /> 

問題は最終的に私が作成する必要があるということですコードビハインドのイベントハンドラMyFrame_ContentChanged。純粋なXAMLでこれを行う方法はありますか?たとえば、ContentChanged依存関係プロパティを何らかのルーティングイベントに変換できますか?

+0

私はWPFの新機能ですから、これは愚かな質問ではないでしょうか。しかし、深刻な答えに感謝します。 – Sipo

+1

'EventTrigger'でそれを使用するには、' RoutedEvent'を使う必要があります。ルーテッド・イベントは依存関係プロパティーと同様に定義されます。このチュートリアルは、[How to:カスタムルーティングイベントの作成](https://msdn.microsoft.com/en-us/library/ms752288(v=vs.100).aspx)のチュートリアルです。 – Grx70

+0

@ Grx70、\tありがとうございます。どのように動作するのかを実演してください。そして、それを上記のコードとどのように統合できますか? – Sipo

答えて

1

EventTriggersでイベントを使用するには、イベントをルーティングする必要があります。ルーテッド・イベントは、依存関係プロパティーと同様の方法で定義されます。開始方法に関する簡単なチュートリアルです:How to: Create a Custom Routed Event。ここで

ContentChangedイベントを定義ContentControlからクラス導出の例です:

public class MyContentControl : ContentControl 
{ 
    public static readonly RoutedEvent ContentChangedEvent 
     = EventManager.RegisterRoutedEvent(
      "ContentChanged", 
      RoutingStrategy.Bubble, 
      typeof(RoutedEventHandler), 
      typeof(MyContentControl)); 

    public event RoutedEventHandler ContentChanged 
    { 
     add { AddHandler(ContentChangedEvent, value); } 
     remove { RemoveHandler(ContentChangedEvent, value); } 
    } 

    protected override void OnContentChanged(object oldContent, object newContent) 
    { 
     base.OnContentChanged(oldContent, newContent); 
     RaiseEvent(new RoutedEventArgs(ContentChangedEvent, this)); 
    } 
} 

私はなぜまだわからないんだけど、この行をテストするStyle内で働いていたが、使用中に例外を投げながら、直接制御のトリガーのコレクションで:

<EventTrigger RoutedEvent="ContentChanged">...</EventTrigger> 

それはこのような状況で動作させるためには、私は完全修飾されたイベントのパスを指定する必要がありました:

<EventTrigger RoutedEvent="local:MyContentControl.ContentChanged">...</EventTrigger> 
関連する問題