我有一个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"
有人可以告诉我,有什么不对吗?
答案 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。