7

我正在尝试在 WPF MVVM 应用程序中实现工具提示系统。工具提示应该出现在作为 MainWindow 一部分的某个 Label 中(不悬停在鼠标指针上),并且应该在鼠标悬停时发生(理想情况下具有可配置的延迟,但这并不重要),调用方法在适当的 ViewModel 中。然后 ViewModel 将处理联系模型层,该层将解析要显示的工具提示等。

我的问题是如何将鼠标悬停事件从视图获取到 ViewModel,以及触发事件的对象的身份(这样我就可以为它解决正确的工具提示)。假设<Label Name="MyLabel" Content="This is a label" />我的 SettingsView.xaml 中有一个,如何让它GetTooltip(string id)在鼠标悬停时以 MyLabel 作为参数(或以其他方式访问)调用 SettingsViewModel 中的方法?我可以<Trigger>以某种方式使用常规来做到这一点吗?

4

3 回答 3

2

您需要做的是将一些命令(ViewModel 与视图中的事件交互的首选方法)连接到鼠标事件,然后使用适当的信息“填充”您的“工具提示”控件。

例如,您的 ViewModel 有一个 ToolTip 属性(表示单向,仅获取 ToolTipViewModel),可以绑定到您的 UI 的某个区域(使用 DataTemplate)。您绑定到新的“MouseOver”命令并根据命令填充/取消 ToolTipViewModel 属性中的对象。这允许可测试性、零代码背后以及使用 DataTemplates 来构建您的工具提示演示。

查看此链接以查看在通常的“非命令”控件上构建命令并绑定到它们是否可以解决您的问题。

于 2011-05-04T15:52:13.643 回答
1

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

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

为了一般地涵盖每个控件,请考虑将处理程序附加到 parentWindowPreviewMouseMove事件(或OnPreviewMouseMove在 Window 的代码隐藏中覆盖),只要任何子元素即将接收到一个,就会调用该处理程序。然后,您可以使用 找出鼠标指针下的控件HitTest。但是,这并不是非常有效,这就是为什么使用内置ToolTip控件可能会更好。

于 2011-05-03T20:47:06.557 回答
0

在控件模板中创建一个带有嵌套 TextBlock 的 Popup 控件(为标签创建样式),将其可见性属性绑定到 IsMouseOver 时,并将 PlacementTarget 绑定到您希望它出现的窗口底部的控件。使用水平/垂直偏移属性微调。

于 2011-05-03T22:38:22.900 回答