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:
- Créer héritées propriétés attachées pour IsMouseLeftButtonDown (et pour les autres boutons trop)
- Créer un « Activé » propriété attachée pour configurer automatiquement les gestionnaires d'événements requis.
- Définissez la propriété "Enabled" directement sur votre contrôle ou sur tout contrôle conteneur.
- 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é.
Est-ce une exigence que vous gériez ceci en XAML, ou pourriez-vous déposer dans le code C# pour accomplir ceci? – Robaticus
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
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