我正在尝试在WPF MVVM应用程序中实现工具提示系统。工具提示应该出现在某个标签中,该标签是MainWindow的一部分(不会悬停在鼠标指针上)并且应该在鼠标悬停时发生(理想情况下具有可配置的延迟,但这并不重要),调用方法在适当的ViewModel中。然后,ViewModel将处理与Model层的联系,该层将解析要显示的工具提示等。
我的问题是如何从视图到ViewModel获取鼠标悬停事件,以及触发事件的对象的身份(因此我可以为它解析正确的工具提示)。假设我的SettingsView.xaml中有一个<Label Name="MyLabel" Content="This is a label" />
,如何在设置ViewViewModel中调用GetTooltip(string id)
方法,并在鼠标悬停时使用MyLabel作为参数(或以其他方式访问)?我可以使用常规<Trigger>
以某种方式执行此操作吗?
答案 0 :(得分:2)
您需要做的是将一些命令(ViewModel的首选方法与View中的事件进行交互)连接到Mouse事件,然后使用适当的信息“填充”“tooltip”控件。
例如,您的ViewModel具有ToolTip属性(表示单向,仅获取ToolTipViewModel),该属性可以绑定到UI的某个区域(使用DataTemplate)。绑定到新的“MouseOver”命令,并根据命令填充/取消ToolTipViewModel属性中的对象。这允许可测试性,零代码,以及使用DataTemplates构建工具提示演示文稿。
Check out this link查看构建命令并在正常的“未命令”控件上绑定它们是否可以解决您的问题。
答案 1 :(得分:1)
首先,您是否尝试过内置ToolTip
控件?它可能会免费为您提供所需的内容,并且可以设置风格/模板来托管复杂的内容。
其次,您可以使用每个WPF控件上可用的MouseEnter
事件。但是,您必须将处理程序附加到要支持的控件上。
为了通常覆盖每个控件,请考虑将处理程序附加到父Window
的{{3}}事件(或覆盖Window的代码隐藏中的OnPreviewMouseMove
),这将是每当任何子元素即将接收时调用。然后,您可以使用PreviewMouseMove
找出鼠标指针下的控件。但这并不是非常有效,这就是为什么你可以通过内置的ToolTip
控件更好的原因。
答案 2 :(得分:0)
在控件模板中创建一个带有嵌套TextBlock的Popup控件(为标签创建一个样式),将其visibility属性绑定到IsMouseOver时,并将PlacementTarget绑定到窗口底部的控件,如果你想要它出现。具有水平/垂直偏移属性的Finetune。