为什么我的xaml中没有处理自定义routedevent

时间:2016-02-25 16:37:08

标签: wpf xaml

我有一个WPF MainWindow和我自己的RoutedEvent,它在按Enter键时被引发。

namespace ZK16
{
public partial class MainWindow : Window
{

    public static readonly RoutedEvent CustomEvent = EventManager.RegisterRoutedEvent(
        "Custom", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MainWindow));

    public event RoutedEventHandler Custom
    {
        add { AddHandler(CustomEvent, value); }
        remove { RemoveHandler(CustomEvent, value); }
    }

    void RaiseCustomEvent()
    {
        Debug.WriteLine("RaiseCustomEvent");
        RoutedEventArgs newEventArgs = new RoutedEventArgs(MainWindow.CustomEvent);
        RaiseEvent(newEventArgs);
    }

    public MainWindow()
    {
        InitializeComponent();
        this.AddHandler(MainWindow.CustomEvent, new RoutedEventHandler(MyCustomHandler));
    }

    private void MyCustomHandler(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine("In Eventhandler...");
    }

    private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
            RaiseCustomEvent();
    }

在XAML中,我添加了一个带有EventTrigger的标签,

<Window x:Class="ZK16.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:ZK16"
    Title="MainWindow"
    PreviewKeyDown="Window_PreviewKeyDown"
    >
<Grid>
    <Label Content="Hello World">
        <Label.Triggers>
            <EventTrigger RoutedEvent="local:MainWindow.Custom">
                <BeginStoryboard>
                    <Storyboard Duration="00:00:1">
                        <DoubleAnimation From="6" To="25" Storyboard.TargetProperty="FontSize"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Label.Triggers>
    </Label>
</Grid>
</Window>

但是在提升自定义事件时, EventTrigger不会触发我的事件,但会触发,例如。

EventTrigger RoutedEvent="Loaded"

有人可以告诉我,有什么不对吗?

1 个答案:

答案 0 :(得分:2)

我认为对路由事件的理解存在一个误解。

MSDN article声明如下:

  

冒泡:调用事件源上的事件处理程序。路由事件然后路由到连续的父元素,直到到达元素树根...

     

隧道:最初,调用元素树根目录的事件处理程序。路由事件然后沿着路径通过连续的子元素路径,朝向作为路由事件源的节点元素(引发路由事件的元素)......

在你的情况下,你有一个冒泡事件。你在MainWindow(源头)中提升它,因此它将从该元素向上开始。没有什么超过MainWindow所以它就会停在那里。

如果您将事件更改为隧道事件,则会发生这种情况。你从MainWindow(来源)提出它,所以事件开始从父母到源头,同样,没有任何东西高于MainWindow,结果相同。

现在,如果您在XAML中执行以下操作:

<Label x:Name="MyLabel" Content="Hello World">

这在您的代码中:

MyLabel.RaiseEvent(newEventArgs);

在冒泡事件的情况下,路线将如下:

Label(来源) - &gt; Grid - &gt; MainWindow

在一个隧道事件的案例中:

MainWindow - &gt; Grid - &gt; Label(来源)

这个人有同样的问题here