2011-05-03 223 views
7

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

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

+2

看看这个链接,看看是否建立命令并绑定到他们通常“非命令”控制可能会解决您的问题。 http://blogs.microsoft.co.il/blogs/tomershamam/archive/2009/04/14/wpf-commands-everywhere.aspx – 2011-05-03 20:37:43

+0

@Dave:这应该是一个答案..我想upvote = ) – Jens 2011-05-04 06:52:59

+0

@Jens - 全部完成。我也加了一点。感谢您的建议。 – 2011-05-04 15:52:43

回答

1

首先,你有没有试过内置的ToolTip控件?它可能会为您提供您所需的免费内容,并且可以对其进行样式化或模板化以承载复杂的内容。

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

为了一般性地覆盖每一个控制,考虑一个处理器附着到母体WindowPreviewMouseMove事件(或在窗口的代码隐藏覆盖OnPreviewMouseMove),每当任何子元素将要接收一个将被调用。然后您可以使用HitTest找出鼠标指针下的控件。但这并不是非常有效,这就是为什么你可以通过内置的ToolTip控制更好。

+0

我可以使用'ToolTip',是的,但正如我所说的,我不希望文本出现在鼠标指针上,我希望它出现在主窗口底部的区域中。 MouseEnter可能工作(我只需要有一个单独的事件来清除MouseLeave上的工具提示,我猜)。我会在明天更好地检查你的答案的其他部分 - 通用的覆盖率理念听起来不错,我认为我需要在每个控件上放置一个事件,我希望提供一个工具提示,但是如果这可行,我可能不需要。现在感谢! – Swooper 2011-05-03 20:57:08

0

使用控件模板中的嵌套TextBlock创建Popup控件(为标签创建样式),将其可见性属性绑定到IsMouseOver时,并将PlacementTarget绑定到窗口底部的控件所需的位置出现。与水平/垂直偏移属性一起使用。

2

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

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

Check out this link看看是否建立命令和绑定到他们通常“非命令”控制可能会解决您的问题。