如何让mouseenter事件仅在最顶层的控件上触发

时间:2016-01-24 14:35:07

标签: .net wpf

我有一个usercontrol,它可以创建更多自身,根据需要在其中重叠(它是一种树视图)。我想添加一个高亮效果,所以我将它附加到mouseenter / mouseleave事件,但是只要我将鼠标移动到UC的一个子实例上,父母也会收到该事件并点亮。

我尝试设置e.handled = true,假设事件通过树从子节点向下传递给父节点,但事实并非如此,嵌套控件的每个实例都会生成自己的事件。

我可以阻止这种情况的一种方法是当一个控件接收到这个事件时,它会扫描所有的子孙后代(等)以查看是否还突出显示其中任何一个以防止自己这样做但我不是确保重叠控件以任何特定顺序接收事件,这应该不是那么困难。

除非控件是最顶层的可见控件,否则如何防止事件触发?

1 个答案:

答案 0 :(得分:0)

树视图非常典型的问题。父母也会得到突出显示,因为实际上你也是 TreeViewItem (从可视化树设计的角度来看)。

Please see this link 知道如何使用模板和触发器来完成它。

否则我们也可以聪明,而且非常智能的快捷方式

 private void TreeView_MouseEnter(object sender, MouseEventArgs e)
    {
        var treeItem = (e.OriginalSource as TreeViewItem);
        foreach (var child in treeItem.Items)
        {
            if ((child as TreeViewItem).IsMouseOver)
                return;
        }
        treeItem.Background = new SolidColorBrush(Colors.Red);

    }

如果事件设定者是

 <Style TargetType="{x:Type TreeViewItem}">
        <EventSetter Event="MouseEnter" Handler="TreeView_MouseEnter" />                    
 </Style>

因为事件将始终触发子项首先触发,因此将父项鼠标无效输入事件。:)

在编程方面,我们总是可以找出正确的TreeViewItem,您可以在其中检查递归函数中子项的突出显示。在鼠标退出逻辑中写入相同的逻辑。

希望这样做。