我有以下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
,也会分别调用Grid
和StackPanel
的事件。为什么?我应该怎么做才能阻止路由事件冒泡?
答案 0 :(得分:11)
MouseEnter事件不是冒泡事件,它是直接事件(如经典CLR事件)。来自documentation:
您可以定义多个MouseEnter XAML内容中对象的事件。 但是,如果一个子对象和它 父对象都定义了MouseEnter event,父对象的MouseEnter 事件发生在子对象之前 MouseEnter事件。这不是一个案例 冒泡的事件;它只表示 鼠标(或手写笔)已进入 两个对象,可能是不同的 时间取决于布局和 视觉树的构成。
所以你不能阻止它被父母解雇。您可以使用IsMouseDirectlyOver属性来查看鼠标实际上是否仅在给定元素上方。