Pourquoi ne pas l'événement clic du bouton “bulle visual tree” à StackPanel que l'article MSDN unis?
Dans l'article MSDN La compréhension des Événements Routés et Commandes En WPF, c'états
un événement bulle (propagation) de l'arborescence visuelle à partir de la source de l'élément jusqu'à ce qu'il a été traité ou qu'il atteint l'élément racine.
Toutefois, dans cet exemple, lorsque vous cliquez sur le bouton, il n'a pas de "bulle de l'arborescence visuelle" à être géré par le parent StackPanel événement, c'est à dire en cliquant sur le bouton des feux aucun cas.
Pourquoi pas? Que signifient-ils alors par "bouillonne" si ce pas?
XAML:
<Window x:Class="TestClickEvents456.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel x:Name="TheStackPanel"
Background="Yellow"
MouseDown="TheStackPanel_MouseDown">
<Button x:Name="TheButton"
Margin="10"
Content="Click This"/>
<TextBlock x:Name="TheMessage"
Text="Click the button or the yellow area"/>
</StackPanel>
</Window>
code-behind:
using System.Windows;
using System.Windows.Input;
namespace TestClickEvents456
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void TheStackPanel_MouseDown(object sender, MouseButtonEventArgs e)
{
TheMessage.Text = "StackPanel was clicked.";
}
}
}
Vous devez vous connecter pour publier un commentaire.
L'événement bulles, jusqu'à ce qu'il obtient géré...
Depuis le Bouton fait quelque chose avec vos clics de souris, il absorbe les mouvements de la souris de l'événement et la transforme en un ClickEvent.
Si vous utilisez le PreviewMouseDown, vous voyez que le StackPanel première reçoit l'événement avant que le bouton ne.. Aperçu des événements dans le Tunnel approche..
Comme d'autres l'ont dit, c'est parce que le
MouseDown
événement est prise en charge par laButton
avant de pouvoir barboter plus loin. Vous pouvez les voir dans le Réflecteur, enButtonBase.OnMouseLeftButtonDown
:Une solution est à l'écoute pour une
MouseDown
de l'événement, et d'indiquer que vous n'avez pas de soins si l'événement est géré. Vous pouvez faire cela avec leAddHandler
méthode. Il a un booléen surcharge qui permet d'écouter les événements qui sont déjà traités.Si vous faites cela, quelque part au lieu de définir le MouseDown gestionnaire en XAML:
Vous recevrez toutes les
MouseDown
événements surTheStackPanel
, indépendamment de s'ils ont été manipulés.Mouse.AddXXX(DependencyObject, EventHandler);
En outre, si vous souhaitez que le stackpanel pour recevoir l'événement, changer le stackpanel xaml:
et la signature d'événement à:
Dans ce cas, le stackpanel va recevoir l'événement click du bouton. Cependant, en cliquant sur le stackpanel lui-même ne se déclenche pas à tout événement, puisqu'il est à l'écoute spécifiquement à un clic sur un bouton.
C'est que tous les messages sont capturés
manipulépar Bouton et les messages s'arrêtentle message s'arrêtebouillonnement de là. La réponse est dans votre question du texte:EDIT:
Edward Tanguay (OP) ont répondu à cette réponse et je suis la copie de son commentaire ici, car il est très pertinente:
Vous avez raison. Le bouton n'est pas de la manipulation de l'événement MouseDown, car aucun gestionnaire n'a été spécifié lors de la commande en question.
Mais, ensuite, MouseDown est particulier, d'une certaine façon. Au moins dans les Windows Forms il est utilisé pour initier des actions en dessin et en le faisant glisser de la sorte, lorsqu'un contrôle reçoit l'événement, il procède à piéger tous les autres messages de souris, même si vous n'avez pas défini de gestionnaires pour elle. Ce piège est fait quand le contrôle des propriétés de la Capture de Vrai et de ce stopper efficacement les événements ultérieurs de bouillonnait. La Capture de la propriété est à False par Windows Forms quand elle reçoit un événement MouseUp.
Je le répète, c'est la façon dont il fonctionne dans Windows Forms, vous pouvez double-vérifier cela, mais, à mon humble avis il n'ya aucune raison pourquoi cela devrait être différent pour WPF.
De référence: voir la section "Windows traitement de Formulaires" à http://blogs.msdn.com/jfoscoding/archive/2005/07/28/444647.aspx (défilement légèrement à la baisse depuis le milieu de la page).
Note: Voir mon commentaire à Arcturu réponse à une référence sur la bulle et le tunnel événements soulèvent des séquences.
l'événement bouton Supprimer les événements mousedown et mouseup parce que le bouton de l'événement est un événement de haut niveau et ont peu de code qui donnent drapeau poignée de vrai cette cause Supprimée pour mousdown pour résoudre ce problème, vous pouvez ajouter ce code dans le constructeur de la fenêtre