2010-06-29 6 views
1

J'ai une chronologie défilante qui est faite à partir des vues de liste. Lorsque ma souris est focalisée sur la vue de liste.WPF ListView Cursor Change

Le curseur est une main ouverte en utilisant le code

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

mais je me demandais. Y at-il quelque chose que je peux faire si le bouton gauche de la souris est pressé sur la vue de la liste. si c'est alors changer le curseur à une main fermée? Merci d'avance!

+0

Est-ce une exigence que vous gériez ceci en XAML, ou pourriez-vous déposer dans le code C# pour accomplir ceci? – Robaticus

+0

Je pense que ce serait plus efficace si je le fais en XAML. Je peux aussi faire un événement MouseLeftDown, mais ce n'est pas une bonne pratique de codage car cela prend plus de temps, de ressources. – Kevin

+0

Vous n'avez pas besoin de définir la propriété Cursor dans un déclencheur. Lorsque vous définissez la propriété Cursor d'un élément, elle n'affecte le curseur de la souris que lorsqu'elle se trouve sur cet élément. – Nir

Répondre

2

WPF ne possède pas de propriété "IsMouseLeftButtonDown", mais vous pouvez créer votre propre propriété jointe pour cela, puis déclencher. Cela a tendance à être beaucoup plus propre que d'ajouter des gestionnaires d'événements MouseLeftButtonDown à des contrôles individuels.

Pour ce faire:

  1. Créer héritées propriétés attachées pour IsMouseLeftButtonDown (et pour les autres boutons trop)
  2. Créer un « Activé » propriété attachée pour configurer automatiquement les gestionnaires d'événements requis.
  3. Définissez la propriété "Enabled" directement sur votre contrôle ou sur tout contrôle conteneur.
  4. Utilisez le "IsMouseLeftButtonDown" la propriété dans un déclencheur ou MultiTrigger

Voici comment il pourrait ressembler:

<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> 

Voilà comment pourrait être mis en œuvre la propriété ci-joint:

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); 
    } 
} 

Comment ça marche: Le PropertyChangedCallback "Enabled" ajoute la méthode "Update" en tant que gestionnaire pour quatre événements de souris. Lorsque l'un de ces événements se produit, l'état actuel du bouton de la souris est vérifié et les propriétés Is___ButtonDown sont mises à jour sur l'élément où "Enabled" a la valeur true. À partir de là, ces propriétés sont héritées à travers l'arbre logique et visuel. Toutefois, si MouseLeave est reçu, toutes ces propriétés sont définies sur false, car aucun événement de souris ne sera reçu à nouveau jusqu'à ce que la souris soit à nouveau sur l'élément sur lequel "Enabled" a été activé.

+1

Wow Ray, C'est vraiment une bonne idée !! Je n'ai pas pensé à utiliser les propriétés de dépendance pour le faire. Mais je suis encore nouveau dans WPF. MERCI BEAUCOUP! Vous m'avez sauvé beaucoup de temps précieux et de processus de pensée !! MERCI BEAUCOUP UNE FOIS ENCORE. – Kevin

+0

Dans de nombreux scénarios, vous pouvez remplacer MouseExtensions.IsMouseLeftButtonDown par IsMouseCapturedWithin – GEEF