即使重叠对象是IsHitTestVisible = false,也会触发底层对象的MouseLeave

时间:2012-05-11 16:47:28

标签: wpf wpf-controls

我创建了一个自定义弹出窗口,用动画工具提示来装饰我的按钮。我跟踪按钮Button.MouseEnter以决定何时显示弹出窗口。我使用Button.MouseLeave来确定何时隐藏弹出窗口。

问题是如果弹出窗口移动鼠标光标(它的外观是动画的),Button.MouseLeave会过早被触发,尽管事实上我已经为弹出窗口及其所有可视子项设置了IsHitTestVisible = false。

这是WPF的设计方式吗?我需要MouseLeave才能在光标离开按钮本身时触发,而不受弹出窗口的影响。

谢谢

1 个答案:

答案 0 :(得分:5)

我相信Popup控件实际上包含在一个窗口中,这就是弹出窗口在某些情况下可以超出窗口范围的原因。 (这也是Silverlight不支持弹出透明度的原因。)

我相信当弹出控件不再处理“命中”时,容器窗口就是,这就是你失去按钮鼠标焦点的原因。

我没有对此进行过测试,但您可能会尝试为按钮创建模板,并实际将弹出窗口声明为按钮的一部分(而不是在按钮下方)。这可能导致WPF将弹出控件视为按钮的一部分,并消除了丢失鼠标焦点的问题。这适用于其他场景,但我不能100%确定它如何与Popup一起使用。

编辑:作为旁注,deault WPF工具提示允许您覆盖模板。我不确定你的目标是什么,但你可能会发现更改默认工具提示的外观和行为比尝试自己滚动更容易,因为很多这些问题已经在默认的Tooltip中得到解决