2016-04-03 79 views
0

我有一個框架。我切換頁面這一行:WPF:如何爲內容更改創建路由事件?

FrameName.Content = new PageName(); 

我希望在頁面改變了故事板開始,我想這樣做在XAML,而不是在代碼隱藏。我曾嘗試下面的代碼:

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

搜索了一下,我意識到有後沒有內置這種性質的路由事件。第一個答案here表明

最具活力的方法是簡單地推導出自己的標籤控制,提供了一個ContentChanged事件。

我試圖實現這個答案代碼:

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); 
      } 
     } 
    } 
} 

在XAML我用它看起來像這樣:

<local:MyFrame ContentChanged="MyFrame_ContentChanged" /> 

的問題是,最終我需要創建一個事件處理程序MyFrame_ContentChanged在代碼隱藏中。有沒有辦法在純XAML中做到這一點?例如 - 我可以將ContentChanged依賴項屬性轉換爲某種路由事件嗎?

+0

我對WPF很新,所以這很可能是一個愚蠢的問題。不過,我會很感激一個認真的答覆。 – Sipo

+1

爲了在'EventTrigger'中使用它,你需要使用'RoutedEvent'。路由事件的定義與依賴屬性類似。對你來說一個好的起點是本教程:[如何創建自定義路由事件](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

下面是從ContentControl一類派生的一個例子,它定義一個ContentChanged事件:爲什麼,但在使用時測試該線Style內工作,但拋出異常

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)); 
    } 
} 

我還不確定在控件的Triggers集合直接:

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

爲了使它在這種情況下,我必須指定一個完全合格的事件路徑工作:

<EventTrigger RoutedEvent="local:MyContentControl.ContentChanged">...</EventTrigger>