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

C# WPF:如何为更改的内容创建路由事件?,c#,wpf,xaml,eventtrigger,routed-events,C#,Wpf,Xaml,Eventtrigger,Routed Events,我有一个框架。我用此行切换页面: FrameName.Content = new PageName(); 我想要一个故事板在页面更改时开始,我想要用XAML,而不是代码隐藏。我尝试了以下代码: <Frame.Triggers> <EventTrigger RoutedEvent="ContentChanged"> <BeginStoryboard Storyboard="{StaticResource storyboardName}" /&

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

FrameName.Content = new PageName();
我想要一个故事板在页面更改时开始,我想要用XAML,而不是代码隐藏。我尝试了以下代码:

<Frame.Triggers>
    <EventTrigger RoutedEvent="ContentChanged">
        <BeginStoryboard Storyboard="{StaticResource storyboardName}" />
    </EventTrigger>
</Frame.Triggers>
在XAML中,我使用的是如下所示:

<local:MyFrame ContentChanged="MyFrame_ContentChanged" />


问题是,最终我需要在代码隐藏中创建一个事件处理程序
MyFrame\u ContentChanged
。有没有办法在纯XAML中实现这一点?例如-我是否可以将
ContentChanged
依赖项属性转换为某种路由事件?

要将事件与
EventTriggers
一起使用,它们应该是路由事件。路由事件的定义方式类似于依赖项属性。这里有一个关于如何开始的快速教程:

下面是一个从定义
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));
    }
}
我还不知道为什么,但在测试时,这行代码在
样式中工作,但在控件的触发器集合中直接使用时引发了异常:

<EventTrigger RoutedEvent="ContentChanged">...</EventTrigger>
。。。
为了在这种情况下工作,我必须指定一个完全限定的事件路径:

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

我对WPF非常陌生,所以这很可能是一个愚蠢的问题。不过,如果能给我一个严肃的回答,我将不胜感激。为了在
EventTrigger
中使用它,您需要使用
RoutedEvent
。路由事件的定义类似于依赖项属性。本教程是您的一个良好起点:。@Grx70,谢谢。您能演示一下它是如何工作的吗?我如何将其与上面的代码集成在一起?
<EventTrigger RoutedEvent="local:MyContentControl.ContentChanged">...</EventTrigger>