为什么 e.Handled = true 不起作用?

10

我有以下的XAML代码

 <StackPanel MouseEnter="StackPanel_MouseEnter" Height="130" Background="Blue">
    <Grid MouseEnter="Grid_MouseEnter" Height="60" Background="Red" >
       <Button MouseEnter="Button_MouseEnter" Height="20"/>
    </Grid>
 </StackPanel>

在代码后台我正在这样做

private void StackPanel_MouseEnter(object sender, MouseEventArgs e)
{

}

private void Grid_MouseEnter(object sender, MouseEventArgs e)
{
    e.Handled = true;
}

private void Button_MouseEnter(object sender, MouseEventArgs e)
{   
    e.Handled = true;
}

即使我将鼠标移动到 Button 上并设置 e.Handled = trueGridStackPanel 的事件仍然被分别调用。为什么?我该怎么做才能阻止路由事件冒泡?

1个回答

11

MouseEnter事件不是冒泡事件,而是直接事件(就像经典CLR事件一样)。来自文档:

您可以为XAML内容中的对象定义多个MouseEnter事件。但是,如果子对象和其父对象都定义了MouseEnter事件,则父对象的MouseEnter事件会在子对象的MouseEnter事件之前发生。这不是冒泡事件的情况;它仅表示鼠标(或笔)已进入两个对象,具体取决于视觉树的布局和组合,可能在不同的时间。

因此,您无法防止其在父代元素上触发。但是,您可以使用IsMouseDirectlyOver属性来查看鼠标是否只在给定元素上。


1
关于您用户名中的提议,我赞成这个动议! - Qwertie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接