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

本文关键字:true 不起作用 Handled 为什么 | 更新日期: 2023-09-27 17:58:59

我有以下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 = true,也会分别调用GridStackPanel的事件。为什么?我应该怎么做才能阻止路由事件冒泡?

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

MouseEnter事件不是冒泡事件,它是一个直接事件(类似于经典的CLR事件)。来自文件:

您可以定义多个MouseEnterXAML内容中对象的事件。但是,如果子对象及其父对象都定义MouseEnter事件,父对象的MouseEnter事件发生在子对象的MouseEnter事件。事实并非如此冒泡事件;它只表示鼠标(或手写笔)输入的两个对象,可能处于不同的位置时间取决于布局和视觉树的组成。

所以你不能阻止它被父母解雇。您可以使用IsMouseDirectlyOver属性来查看鼠标是否实际上只在给定的元素上。