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

时间:2011-06-09 17:26:05

标签: c# wpf routed-events

我有以下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的事件。为什么?我应该怎么做才能阻止路由事件冒泡?

1 个答案:

答案 0 :(得分:11)

MouseEnter事件不是冒泡事件,它是直接事件(如经典CLR事件)。来自documentation

  

您可以定义多个MouseEnter   XAML内容中对象的事件。   但是,如果一个子对象和它   父对象都定义了MouseEnter   event,父对象的MouseEnter   事件发生在子对象之前   MouseEnter事件。这不是一个案例   冒泡的事件;它只表示   鼠标(或手写笔)已进入   两个对象,可能是不同的   时间取决于布局和   视觉树的构成。

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