WPF中的鼠标悬停事件是什么?

7
我正在尝试在WPF MVVM应用程序中实现一个工具提示系统。该工具提示应出现在MainWindow的某个Label上(而非悬停在鼠标指针上),并应在鼠标悬停时(最好带有可配置的延迟,但这不重要)调用适当ViewModel中的方法。然后ViewModel将处理与Model层的联系,以解决要显示哪个工具提示等问题。
我的问题是如何从视图获取鼠标悬停事件及触发该事件的对象的标识(以便我可以为其解析正确的工具提示)。假设我在SettingsView.xaml中有一个

2
请查看此链接,以查看在通常“未命令”控件上构建命令并将其绑定到它们是否可以解决您的问题。http://blogs.microsoft.co.il/blogs/tomershamam/archive/2009/04/14/wpf-commands-everywhere.aspx - Dave White
@Dave:这应该是一个答案..我想点赞它=) - Jens
@Jens - 已完成。我还添加了一点内容。感谢您的建议。 - Dave White
3个回答

2
你需要做的是将一些命令(ViewModel与View中事件交互的首选方法)与鼠标事件连接起来,然后使用相应的信息“填充”你的“工具提示”控件。
例如,你的ViewModel有一个ToolTip属性(表示单向、只读的ToolTipViewModel),可以将其绑定到UI的某个区域(使用DataTemplate)。你绑定到新的“MouseOver”命令,并根据命令填充/清空ToolTipViewModel属性中的对象。这样可以实现可测试性、零代码后台和使用DataTemplates构建工具提示演示。 点击此链接查看是否可以通过构建命令并将其绑定到通常“未命令化”的控件上来解决问题。

1

首先,您尝试过内置的ToolTip控件吗?它可能可以免费提供您所需的内容,并且可以进行样式/模板化以托管复杂内容。

其次,您可以使用每个WPF控件上可用的MouseEnter事件。不过,您需要将处理程序附加到要支持的控件。

为了通用地覆盖每个控件,考虑将处理程序附加到父WindowPreviewMouseMove事件(或在Window的代码后台中重写OnPreviewMouseMove),这将在任何子元素即将接收到鼠标移动事件时被调用。然后,您可以使用HitTest找出鼠标指针下面的控件。不过,这并不是非常高效的,这就是为什么您最好使用内置的ToolTip控件的原因。

我可以使用 ToolTip,但正如我所说,我不希望文本出现在鼠标指针上,而是希望它出现在主窗口底部的一个区域。MouseEnter 可能有效(我只需要有一个单独的事件在 MouseLeave 上清除工具提示)。我明天会更好地检查你的答案的其余部分 - 通用覆盖思想听起来不错,我假设我需要在每个控件上放置一个事件才能获得工具提示,但如果这样可以工作,我可能不必这样做。谢谢! - Swooper

0
在您的控件模板中创建一个带有嵌套TextBlock的弹出控件(为标签创建样式),将其可见性属性绑定到IsMouseOver,将PlacementTarget绑定到窗口底部的控件上,以确定它的位置。使用水平/垂直偏移属性进行微调。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接