2010-07-01 3 views
3

J'ai deux contrôles A et B. Contrôle B est placé sur A. Lorsque B est cliqué seulement son événement cliqué est déclenché, mais j'ai besoin de l'événement de clic de A à feu aussi. Cela peut-il être réalisé en utilisant des événements routés?Clic événement pour les contrôles ci-dessous d'autres contrôles

Voici une capture d'écran des contrôles:

alt text http://www.imagebanana.com/img/hu5znv4/buttons.png

Bien sûr, ce cas est juste un exemple réduite, je suis à la recherche d'une manière générale pour déclencher des événements sur tous les contrôles en dessous du curseur de la souris/à un endroit. Cependant, une solution concrète à ce problème m'aiderait aussi! Merci beaucoup pour tout conseil!

Répondre

2

Cela peut se produire si le gestionnaire d'événements du contrôle interne définit la propriété e.Handled sur true. Cela empêcherait l'événement routé de continuer à bouillonner. Mais je viens de vérifier et je ne vois pas ce comportement dans WPF 4.

Si e.Handled empêche votre événement, vous pouvez cependant utiliser la surcharge UIElement.AddHandler qui prend un paramètre boolean processedEventsToo pour connecter votre événement click . Cela doit être fait dans le code, pas de balisage. Ensuite, vous devriez recevoir l'événement Click dans le contrôle externe et la propriété e.Handled sera déjà définie sur true.

Le code suivant définit l'arrière-plan des deux boutons lorsque je clique sur le bouton intérieur.

<Grid> 
    <Button VerticalAlignment="Center" HorizontalAlignment="Center" Click="Click1"> 
     <Button Width="100" Height="25" Margin="20" Click="Click2" /> 
    </Button> 
</Grid> 

code Derrière

private void Click1(object sender, RoutedEventArgs e) 
{ 
    ((Button)sender).Background = new SolidColorBrush(Colors.Blue); 
} 

private void Click2(object sender, RoutedEventArgs e) 
{ 
    ((Button)sender).Background = new SolidColorBrush(Colors.Red); 
    //e.Handled = true; // uncomment to stop bubbling 
} 
+1

A noter que votre solution * ne * faire "l'événement click' A' [...] le feu trop" comme par l'OP - si un gestionnaire pour 'Button.Click' enregistré sur' ButtonA' * va aussi attraper l'événement. C'est une différence subtile mais importante! –

+1

Bonjour Josh, merci pour votre réponse. Ça m'a pris un moment pour savoir pourquoi tu travailles: Tu as placé le deuxième bouton * à l'intérieur * et pas * au-dessus * de l'autre. Dans la manière est aussi une possiblité, je me demande juste s'il y a une manière plus confortable. Quelque chose comme le passage automatique d'événements comme c'est le cas lorsque IsHitTestVisible est défini sur false, mais toujours le contrôle où IsHitTestVisible est faux ..): –

+0

@stefan - Vous pouvez ajouter un gestionnaire MouseLeftButtonDown à l'objet Window racine en utilisant le paramètre processedEventsToo puis utiliser VisualTreeHelper.HitTest pour savoir quels éléments croisent le point sur lequel vous avez cliqué. Voir http://msdn.microsoft.com/en-us/library/ms752097.aspx#using_a_hit_test_result_callback – Josh

Questions connexes