На событие наведения мыши в WPF? - PullRequest
7 голосов
/ 03 мая 2011

Я пытаюсь реализовать систему подсказок в приложении WPF MVVM. Подсказка должна появиться в определенной метке, которая является частью MainWindow (не находится под указателем мыши) и должна происходить при наведении курсора мыши (в идеале с настраиваемой задержкой, но это неважно), вызывая метод в соответствующей ViewModel. Затем ViewModel будет иметь дело с контактом со слоем Model, который решит, какую подсказку отображать и т. Д.

Моя проблема заключается в том, как получить событие наведения мыши из представления во ViewModel вместе с идентификатором объекта, который вызвал событие (поэтому я могу найти для него нужную подсказку). Допустим, у меня есть <Label Name="MyLabel" Content="This is a label" /> в моем SettingsView.xaml, как мне заставить его вызывать метод GetTooltip(string id) в SettingsViewModel с MyLabel в качестве аргумента (или иным образом доступным) при наведении курсора мыши? Можно ли как-нибудь использовать обычный <Trigger>?

Ответы [ 3 ]

2 голосов
/ 04 мая 2011

Что вам нужно сделать, это подключить некоторые команды (предпочтительный подход для ViewModels для взаимодействия с событиями в View) к событиям Mouse, а затем «заполнить» ваш элемент управления «tooltip» соответствующей информацией.

Например, ваш ViewModel имеет свойство ToolTip (которое представляет собой одностороннюю функцию, получить только ToolTipViewModel), которое можно привязать к области вашего пользовательского интерфейса (с помощью DataTemplate).Вы привязываетесь к новой команде MouseOver и заполняете / аннулируете объект, который находится в вашем свойстве ToolTipViewModel, на основе команд.Это позволяет обеспечить тестируемость, отсутствие нуля и использование DataTemplates для создания презентации всплывающей подсказки.

Проверьте эту ссылку , чтобы увидеть, создаются ли команды и привязываются к ним на обычно "некомбинированных" элементах управления.может решить вашу проблему.

1 голос
/ 04 мая 2011

Сначала вы пробовали встроенный элемент управления ToolTip?Он может дать вам то, что вам нужно бесплатно, и он может быть стилизован / шаблонизирован для размещения сложного контента.

Во-вторых, вы можете использовать событие MouseEnter, доступное на каждомWPF контроль.Однако вам придется прикрепить ваш обработчик к элементам управления, которые вы хотите поддерживать.

Для общего охвата каждого элемента управления рассмотрите возможность присоединения обработчика к родительскому элементу Window 'PreviewMouseMove событие (или переопределение OnPreviewMouseMove в коде окна), которое будет вызываться всякий раз, когда какой-либо дочерний элемент собирается его получить.Затем вы можете узнать, какой элемент управления находится под указателем мыши, используя HitTest.Однако это не очень эффективно, поэтому вам может быть лучше с помощью встроенного элемента управления ToolTip.

0 голосов
/ 04 мая 2011

Создайте всплывающий элемент управления с вложенным TextBlock в шаблоне элемента управления (создайте стиль для метки), свяжите его свойство видимости с параметром IsMouseOver и привяжите PlacementTarget к элементу управления в нижней части окна, где вы хотите его разместить. появляются. Finetune со свойствами горизонтального / вертикального смещения.

...