WPF:如何为内容更改创建路由事件?

我有一个框架。 我用这一行切换页面:

FrameName.Content = new PageName(); 

我希望在页面发生变化时开始使用故事板,我想在XAML中进行,而不是在代码隐藏中。 我试过以下代码:

      

在搜索了一下后,我意识到没有那种性质的内置路由事件。 这里的第一个答案表明

最动态的方法是简单地派生自己的标签控件,该控件提供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中,我使用它看起来像这样:

  

问题是最终我需要在代码隐藏中创建一个事件处理程序MyFrame_ContentChanged 。 有没有办法在纯XAML中执行此操作? 例如 – 我可以将ContentChanged依赖项属性转换为某种路由事件吗?

为了将事件与EventTriggers一起使用,它们应该是路由事件。 路由事件的定义方式与依赖属性类似。 以下是如何入门的快速教程: 如何:创建自定义路由事件 。

以下是从ContentControl派生的类的示例,它定义了ContentChanged事件:

 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 ,但在控件的触发器集合中直接使用时抛出exception:

 ... 

为了使它在这种情况下工作,我必须指定一个完全限定的事件路径:

 ...