WPF ListView Изменение курсора - PullRequest
1 голос
/ 29 июня 2010

У меня есть прокручиваемая временная шкала, которая сделана из представлений списка.Когда моя мышь сфокусирована на виде списка.

Курсор - это открытая рука, использующая код

<ControlTemplate.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
        <Setter Property="Cursor" Value="openHand.cur"/>
    </Trigger>                    
</ControlTemplate.Triggers>

, но мне было интересно.Есть ли что-то, что я могу сделать, если нажать левую кнопку мыши над списком.если это затем изменить курсор на закрытую руку?Заранее спасибо!

1 Ответ

2 голосов
/ 30 июня 2010

WPF не имеет свойства «IsMouseLeftButtonDown», но вы можете создать собственное присоединенное свойство, чтобы сделать это, а затем активировать его.Это, как правило, намного чище, чем добавление обработчиков событий MouseLeftButtonDown к отдельным элементам управления.

Для этого:

  1. Создать унаследованные вложенные свойства для IsMouseLeftButtonDown (и для других кнопок тоже)
  2. Создайте вложенное свойство «Включено» для автоматической установки необходимых обработчиков событий.
  3. Установите свойство «Включено» непосредственно на элементе управления или на любом содержащем его элементе управления.
  4. ИспользуйтеСвойство «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».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...