2016-04-03 61 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>