Wpf 事件不冒泡

San*_*olo 6 c# wpf events

这是我的 XAML:

<Window x:Class="WpfApplication4.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="844.025" Width="678"  MouseUp="somethingClicked">
<Grid MouseUp="somethingClicked">
    <StackPanel MouseUp="somethingClicked" Margin="0,0,10,0">
    <Button x:Name="btnClickMe" Content="Click Me!" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="101,22,0,0" MouseUp="somethingClicked"/>
        <CheckBox x:Name="chkhandle" Content="CheckBox" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="241,28,0,0" RenderTransformOrigin="-0.588,1.188"/>
        <ListBox x:Name="lstEvents" HorizontalAlignment="Left" Height="604" VerticalAlignment="Top" Width="416" Margin="29,66,0,0"/>
    </StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)

这是 C# 代码:

namespace WpfApplication4
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    protected int eventCounter = 0;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void somethingClicked(object sender, RoutedEventArgs e)
    {
        eventCounter++;

        String message = "#" + eventCounter.ToString() + ":\r\n" +
            " Sender: " + sender.ToString() + ":\r\n" +
            " Source: " + e.Source + ":\r\n" +
            " Original Source: " + e.OriginalSource;

        lstEvents.Items.Add(message);
        e.Handled = (bool) chkhandle.IsChecked;

        if (e.Handled)
            lstEvents.Items.Add("Completed");   

    }
}
Run Code Online (Sandbox Code Playgroud)

}

我在此示例中遇到以下问题: 1) 单击按钮时不会触发 MouseUp 事件。2)事件不会冒泡。单击表单上的某处将显示:

Sender:WpfApplication4.MainWindow:
Source:WpfApplication4.MainWindow:
Original Source: System.Windows.Controls.Border.
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,当单击按钮时,首先应该在窗口级别执行(现在就是这样),然后是网格,然后是堆栈,最后是文本标签。是代码错误还是我对概念的理解错误?

Ana*_*aev 6

The MouseUp event is not fired on clicking the button.

因为第一次触发的是 处的事件Button.Click,而当它起作用时,它与事件 发生冲突MouseUp。引用自这里

ButtonBase继承自UIElement,Button还可以访问为UIElement定义的所有鼠标按钮事件。因为 Button 会响应按钮按下而执行某些操作,所以它会吞掉冒泡事件(例如 MouseLeftButtonDown 和 MouseDown)。您仍然可以通过添加隧道事件的处理程序(例如 PreviewMouseLeftButtonDown 和 PreviewMouseDown)来检测这些较低级别的按钮按下事件。

尝试替换Buttonon Label,你会得到想要的结果:

在此输入图像描述