C# Wpf事件未冒泡

C# Wpf事件未冒泡,c#,wpf,events,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="s

这是我的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>

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

微软写了一个很好的解释

MouseUp
PreviewMouseUp
事件也会发生同样的情况 在您的例子中,
e.Handled=(bool)chkhandle.IsChecked停止事件的路由

如果您想调试事件,您可以使用它来很好地说明在哪些对象上发生了哪些事件以及谁处理了这些事件

  • 请尝试处理PreviewMouseDown事件。你仍然可以 从XAML附加那个。在你的处理程序中

  • 改为在代码中附加事件处理程序。使用 AddHandler

  • 单击按钮时不会触发MouseUp事件。

    因为第一次激发是
    按钮上的事件。单击
    ,当它工作时,它与事件
    鼠标点
    冲突。引自:

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

    尝试更换
    标签
    上的
    按钮
    ,您将得到所需的结果:


    有一个覆盖可用于处理事件,即使它们被标记为已处理。它要求您通过以下代码添加处理程序:

    MainWindow.AddHander(UIElement.MouseUpEvent, new MouseButtonEventHandler(button1_MouseUp), true);
    

    最后一个参数指定是否接受已处理的事件。如果将该处理程序添加到主窗口中,您会注意到按钮中的路由MouseUp事件确实在冒泡(但它们的e.Handled表示它们已被处理)。

    我不知道为什么,但它对右键单击有效。@Naren:因为当您单击左键时,会触发
    单击
    事件,因此,吞咽鼠标事件(MouseUp、MouseDown、MouseLeftButtonDown)。当您右键单击时,
    单击
    事件不会触发。@AnatoliyNikolaev谢谢..我从未注意到..谢谢链接。我已经把它放进书签了。我觉得这个概念有点难。我不得不不断地重游,谢谢。用标签替换按钮按预期工作。还在学习。我将致力于建立一个计算器,希望它将是明确的。
    Sender:WpfApplication4.MainWindow:
    Source:WpfApplication4.MainWindow:
    Original Source: System.Windows.Controls.Border.
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
            Grid1.MouseUp += new MouseButtonEventHandler(Grid1_MouseUp);
    }
    private void Grid1_MouseUp(object sender, MouseButtonEventArgs e)
    {
            MessageBox.Show("Mouseup");
    }
    
    MainWindow.AddHander(UIElement.MouseUpEvent, new MouseButtonEventHandler(button1_MouseUp), true);