Il n'existe pas de moyen facile de gérer un événement Click
sans deux rappels sur un Grid
. Mais nous pouvons écrire du code d'aide pour le remplir.
Voici comment vous pouvez utiliser mon code d'assistance:
<Grid Background="Transparent">
<local:RoutedEventExtension.Event>
<local:ClickEvent Click="Grid_Click"></local:ClickEvent>
</local:RoutedEventExtension.Event>
</Grid>
XAML ci-dessus.
private void Grid_Click(object sender, EventArgs e)
{
// Write your event handler code here.
}
C# ci-dessus.
Ceci est mon code d'assistance:
public abstract class RoutedEventExtension
{
public static readonly DependencyProperty EventProperty = DependencyProperty.RegisterAttached(
"Event", typeof(RoutedEventExtension), typeof(RoutedEventExtension),
new PropertyMetadata(null, OnEventChanged));
public static void SetEvent(DependencyObject element, RoutedEventExtension value)
{
element.SetValue(EventProperty, value);
}
public static RoutedEventExtension GetEvent(DependencyObject element)
{
return (RoutedEventExtension) element.GetValue(EventProperty);
}
private static void OnEventChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!(d is IInputElement element))
{
throw new InvalidOperationException("RoutedEventExtension can only be attached on an IInputElement.");
}
var oldValue = (RoutedEventExtension) e.OldValue;
var newValue = (RoutedEventExtension) e.NewValue;
oldValue?.Detach();
newValue.Attach(element);
}
protected IInputElement Target { get; private set; }
private void Attach(IInputElement target)
{
Target = target;
OnAttached();
}
private void Detach()
{
try
{
OnDetaching();
}
finally
{
Target = null;
}
}
protected abstract void OnAttached();
protected abstract void OnDetaching();
}
public sealed class ClickEvent : RoutedEventExtension
{
public event EventHandler Click;
protected override void OnAttached()
{
Target.MouseLeftButtonDown += OnMouseLeftButtonDown;
Target.MouseLeftButtonUp += OnMouseLeftButtonUp;
Target.LostMouseCapture += OnLostMouseCapture;
}
protected override void OnDetaching()
{
Target.MouseLeftButtonDown -= OnMouseLeftButtonDown;
Target.MouseLeftButtonUp -= OnMouseLeftButtonUp;
Target.LostMouseCapture -= OnLostMouseCapture;
}
private bool _isMouseDown;
private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_isMouseDown = true;
Mouse.Capture(Target);
}
private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (!_isMouseDown)
{
return;
}
Mouse.Capture(null);
OnClick();
}
private void OnLostMouseCapture(object sender, MouseEventArgs e)
{
_isMouseDown = false;
}
private void OnClick()
{
Click?.Invoke(this, EventArgs.Empty);
}
}
Le code d'aide se compose de deux classes. Un pour fournir un moyen commun d'attacher un événement sur un IInputElement
, l'autre pour fournir une implémentation de base Click
.
Vous pouvez écrire vous-même votre propre implémentation d'événement en héritant de RoutedEventExtension
.
avez-vous des exemples de code pour que ce comportement puisse être reproduit? –
@GingerNinja a ajouté un extrait – John
Qu'en est-il de votre XAML, grille, etc. Il serait bon de pouvoir voir si le problème peut être reproduit. –