2011-05-03 178 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看看是否建立命令和綁定到他們通常「非命令」控制可能會解決您的問題。