在MSDN文章" 了解WPF中的路由事件和命令"中,它说明了这一点
事件将从源元素向上冒泡(传播)可视树,直到它被处理或到达根元素.
但是,在此示例中,当您单击按钮时,它不会"冒泡可视树"以由父StackPanel事件处理,即单击按钮不会触发任何事件.
为什么不?如果不是这样的话,他们是什么意思"冒泡"?
XAML:
<Window x:Class="TestClickEvents456.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel x:Name="TheStackPanel"
Background="Yellow"
MouseDown="TheStackPanel_MouseDown">
<Button x:Name="TheButton"
Margin="10"
Content="Click This"/>
<TextBlock x:Name="TheMessage"
Text="Click the button or the yellow area"/>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
后台代码:
using System.Windows;
using System.Windows.Input;
namespace TestClickEvents456
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void TheStackPanel_MouseDown(object sender, MouseButtonEventArgs e)
{
TheMessage.Text = "StackPanel was clicked.";
}
}
}
Run Code Online (Sandbox Code Playgroud) 我意识到当使用与EventTrigger关联的InvokeCommandAcction时,原始事件仍然会路由到父元素,直到它被处理.好吧,我想这是一种预期的行为.但我的问题是如何将事件标记为Handled,以便它不会在整个UI树中传播?
实际上,当您在命令中处理此事件时,所有内容都将在此命令中处理,因此不需要传播.在我发现的一个案例中,它会导致一些不必要的行为.例如,当用户双击元素(MouseDoubleClick事件)时,我打开一个新窗口.问题是新窗口打开然后主窗口返回到新窗口的前面,因为MouseDoubleClick事件刚刚到达UI树中的顶部元素.想要的行为是保持新窗口在前面,但是当InvokeCommandAction让事件向上传播时,主窗口会收回焦点......
我可以做的是使用CallMethodAction资产,但因为我在MVVM场景中,我不想在我的代码中使用UI事件参数.即使这会让我隐含地将事件标记为已处理并解决问题.
<UserControl x:Class="..."
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding Path=DisplayReportCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
...
</UserControl>
Run Code Online (Sandbox Code Playgroud)