2010-06-29 5 views
1

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

Курсор является открытой рукой, используя код

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

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

+0

Требование, чтобы вы справлялись с этим в XAML, или можете ли вы перейти к C# -коду, чтобы выполнить это? – Robaticus

+0

Я думаю, что было бы более эффективно, если я сделаю это в XAML. Я также могу сделать событие MouseLeftDown, но это не хорошая практика кодирования, так как требуется больше времени, ресурсов. – Kevin

+0

Вам не нужно устанавливать свойство Cursor в триггере, когда вы устанавливаете свойство Cursor элемента, оно будет влиять только на курсор мыши, когда он находится на этом элементе. – Nir

ответ

2

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

Для этого:

  1. Создания унаследованных присоединенных свойств IsMouseLeftButtonDown (и для других кнопок тоже)
  2. Создать «Enabled» вложенное свойство автоматически устанавливать необходимые обработчик событий.
  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 обновляются в элементе, где для параметра «Включено» установлено значение true. Оттуда эти свойства наследуются вниз через логическое и визуальное дерево. Однако, если MouseLeave получен, для всех этих свойств установлено значение false, так как никакие события мыши не будут получены снова, пока мышь снова не будет по элементу, включенному «Включено».

+1

Wow Ray, Это такая хорошая идея! Я не думал об использовании свойств зависимостей для этого. Но я все еще новичок в WPF. БОЛЬШОЕ СПАСИБО! Ты спас мне много полезного времени и мысли! СПАСИБО СЛЕДУЕТ СНОВА СНОВА. – Kevin

+0

Во многих сценариях вы можете заменить этот MouseExtensions.IsMouseLeftButtonDown с помощью только IsMouseCapturedWithin – GEEF