【问题标题】:How to get mouseenter event to trigger only on the topmost control如何让 mouseenter 事件仅在最顶层的控件上触发
【发布时间】:2023-03-15 16:54:02
【问题描述】:

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

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

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

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

【问题讨论】:

标签: .net wpf


【解决方案1】:

非常典型的树视图问题。父母也被突出显示,因为实际上您也超过了那个 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,您可以在其中检查递归函数中子项的突出显示。在鼠标退出逻辑处编写相同的逻辑。

希望这样可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多