【问题标题】:On mouse-over event in WPF?WPF中的鼠标悬停事件?
【发布时间】:2011-08-17 23:37:26
【问题描述】:

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

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

【问题讨论】:

标签: wpf events mvvm mouseover onmouseover


【解决方案1】:

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

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

Check out this link 看看是否在通常的“非命令”控件上构建命令并绑定到它们可能会解决您的问题。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我可以使用ToolTip,是的,但正如我所说,我不希望文本出现在鼠标指针上,我希望它出现在主窗口底部的区域中。 MouseEnter 可能会起作用(我猜我只需要一个单独的事件来清除 MouseLeave 上的工具提示)。明天我会更好地检查你的其余答案 - 通用覆盖的想法听起来不错,我认为我需要在我想要工具提示的每个控件上放置一个事件,但如果这可行,我可能不必这样做。现在谢谢!
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2020-06-25
      • 2011-11-09
      • 1970-01-01
      相关资源
      最近更新 更多