WPF не имеет свойства «IsMouseLeftButtonDown», но вы можете создать собственное присоединенное свойство, чтобы сделать это, а затем активировать его.Это, как правило, намного чище, чем добавление обработчиков событий MouseLeftButtonDown к отдельным элементам управления.
Для этого:
- Создать унаследованные вложенные свойства для IsMouseLeftButtonDown (и для других кнопок тоже)
- Создайте вложенное свойство «Включено» для автоматической установки необходимых обработчиков событий.
- Установите свойство «Включено» непосредственно на элементе управления или на любом содержащем его элементе управления.
- ИспользуйтеСвойство «IsMouseLeftButtonDown» в Trigger или MultiTrigger
Вот как это может выглядеть:
<Window ...
local:MouseExtensions.Enabled="true" /> <!-- Set the handlers -->
...
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True" >
<Setter Property="Cursor" Value="openHand.cur"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="local:MouseExtensions.IsMouseLeftButtonDown" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Cursor" Value="closedHand.cur" />
</MultiTrigger>
</ControlTemplate.Triggers>
Вот как может быть реализовано присоединенное свойство:
public class MouseExtensions : DependencyObject
{
// IsMouseLeftButtonDown
public static bool GetIsMouseLeftButtonDown(DependencyObject obj) { return (bool)obj.GetValue(IsMouseLeftButtonDownProperty); }
public static void SetIsMouseLeftButtonDown(DependencyObject obj, bool value) { obj.SetValue(IsMouseLeftButtonDownProperty, value); }
public static readonly DependencyProperty IsMouseLeftButtonDownProperty = DependencyProperty.RegisterAttached("IsMouseLeftButtonDown", typeof(bool), typeof(MouseExtensions), new FrameworkPropertyMetadata
{
Inherits=true,
});
// IsMouseMiddleButtonDown
public static bool GetIsMouseMiddleButtonDown(DependencyObject obj) { return (bool)obj.GetValue(IsMouseMiddleButtonDownProperty); }
public static void SetIsMouseMiddleButtonDown(DependencyObject obj, bool value) { obj.SetValue(IsMouseMiddleButtonDownProperty, value); }
public static readonly DependencyProperty IsMouseMiddleButtonDownProperty = DependencyProperty.RegisterAttached("IsMouseMiddleButtonDown", typeof(bool), typeof(MouseExtensions), new FrameworkPropertyMetadata
{
Inherits=true,
});
// IsMouseRightButtonDown
public static bool GetIsMouseRightButtonDown(DependencyObject obj) { return (bool)obj.GetValue(IsMouseRightButtonDownProperty); }
public static void SetIsMouseRightButtonDown(DependencyObject obj, bool value) { obj.SetValue(IsMouseRightButtonDownProperty, value); }
public static readonly DependencyProperty IsMouseRightButtonDownProperty = DependencyProperty.RegisterAttached("IsMouseRightButtonDown", typeof(bool), typeof(MouseExtensions), new FrameworkPropertyMetadata
{
Inherits=true,
});
// Enabled
public static bool GetEnabled(DependencyObject obj) { return (bool)obj.GetValue(EnabledProperty); }
public static void SetEnabled(DependencyObject obj, bool value) { obj.SetValue(EnabledProperty, value); }
public static readonly DependencyProperty EnabledProperty = DependencyProperty.RegisterAttached("Enabled", typeof(bool), typeof(MouseExtensions), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
var element = (FrameworkElement)obj;
if((bool)e.OldValue)
{
element.PreviewMouseDown -= Update;
element.PreviewMouseUp -= Update;
element.MouseEnter -= Update;
element.MouseLeave -= Update;
}
if((bool)e.NewValue)
{
element.PreviewMouseDown += Update;
element.PreviewMouseUp += Update;
element.MouseEnter += Update;
element.MouseLeave += Update;
}
}
});
private static void Update(object sender, MouseEventArgs e)
{
var element = (FrameworkElement)sender;
bool inside = e.RoutedEvent!=Mouse.MouseLeaveEvent;
SetIsMouseLeftButtonDown(element, inside && e.LeftButton==MouseButtonState.Pressed);
SetIsMouseMiddleButtonDown(element, inside && e.MiddleButton==MouseButtonState.Pressed);
SetIsMouseRightButtonDown(element, inside && e.RightButton==MouseButtonState.Pressed);
}
}
Как это работает: PropertyChangedCallback «Включен» добавляет метод «Обновление» в качестве обработчика для четырех событий мыши.Когда происходит одно из этих событий, текущее состояние кнопки мыши проверяется, и свойства Is___ButtonDown обновляются для элемента, для которого «Enabled» было установлено в значение true.Оттуда эти свойства наследуются через логическое и визуальное дерево.Однако, если MouseLeave получен, все эти свойства устанавливаются в false, поскольку никакие события мыши не будут приниматься снова, пока мышь снова не окажется над элементом, для которого было установлено «Enabled».