我创建了一个自定义弹出窗口来用动画工具提示装饰我的按钮。我跟踪按钮的 Button.MouseEnter 以决定何时显示弹出窗口。我使用 Button.MouseLeave 来确定何时隐藏弹出窗口。
问题是 Button.MouseLeave 如果弹出窗口移动到鼠标光标上(它的外观是动画的),尽管我已经为弹出窗口及其所有可视子项设置了 IsHitTestVisible = false ,但会过早地触发。
这是 WPF 设计的工作方式吗?我需要 MouseLeave 仅在光标移离按钮本身并且不受弹出窗口影响时才触发。
谢谢
最佳答案
我相信 Popup 控件实际上包含在一个窗口中,这就是为什么在某些情况下弹出窗口可以超出窗口边界的原因。 (这也是 Silverlight 不支持弹出窗口透明度的原因。)
我相信,虽然弹出控件不再处理“点击”,但容器窗口正在处理,这就是您失去按钮鼠标焦点的原因。
我没有测试过这个,但你可以尝试为你的按钮创建一个模板,并实际将弹出窗口声明为按钮的一部分(而不是在它下面)。这可能会导致 WPF 将弹出控件视为按钮的一部分并消除失去鼠标焦点的问题。这适用于其他场景,但我不是 100% 确定这将如何与 Popup 一起使用。
编辑:作为旁注,默认 WPF 工具提示允许您覆盖模板。我不确定您的目标是什么,但您可能会发现更改默认工具提示的外观和行为比尝试自己滚动更容易,因为默认工具提示中已经解决了许多此类问题.
关于wpf - 即使重叠对象是 IsHitTestVisible = false 也会触发底层对象的 MouseLeave,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10555470/