2010-09-25 19 views
0

Salut Je suis learningign WPF et actuellement je suis en train de lire sur RoutedEvents. Dans le livre « WPF Pro C# » il y a un certain snipet code que je vous présente ci-dessousWPF - Understanding RoutedEvents

<Window x:Class="RoutedEventsLearning.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" MouseUp="SomethingClicked" > 
    <Grid Margin="3" MouseUp="SomethingClicked"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Label Margin="5" Grid.Row="0" HorizontalAlignment="Left" 
Background="AliceBlue" BorderBrush="Black" BorderThickness="1" 
MouseUp="SomethingClicked"> 
      <StackPanel MouseUp="SomethingClicked"> 
       <TextBlock Margin="3" 
MouseUp="SomethingClicked"> 
Image and text label</TextBlock> 
       <Image Stretch="None" 
MouseUp="SomethingClicked" /> 
       <TextBlock Margin="3" 
MouseUp="SomethingClicked"> 
Courtesy of the StackPanel</TextBlock> 
      </StackPanel> 
     </Label> 
     <ListBox Grid.Row="1" Margin="5" Name="lstMessages"></ListBox> 
     <CheckBox Grid.Row="2" Margin="5" Name="chkHandle"> 
      Handle first event</CheckBox> 

    </Grid> 
</Window> 

Le point est que je ne vois pas de différence/avantage des événements routés (judgin par cet exemple). En C# classique, je ferais la même chose - ajouter un gestionnaire à chaque élément de mon formulaire (comme cela a été fait ici). Au début, lorsque je lisais des événements routés, il semble que cela fonctionne de cette façon. J'ajoute un gestionnaire d'événements pour le parent de tous les éléments visuels sur mon formulaire/contrôle/windows. Si je clique sur l'enfant, l'événement mousedown est levé et descend dans l'arborescence visuelle. Si l'événement atteint la grille, le gestionnaire d'événements est appelé. Cependant, je me trompais ou je me trompais. Quelqu'un pourrait-il m'expliquer la différence entre les événements normaux et les événements routés

Modifier Quelque chose d'étrange se passe avec l'insertion d'un code. Insted de tout le code snipet je reçois seulement l'étiquette

Répondre

0

Je ne sais pas ce que vous voulez dire. RoutedEvents peut remonter ou descendre l'arborescence visuelle en fonction de RoutingStrategy. Par défaut, RoutingStrategy est défini sur Bubble (déplacement de l'enfant vers le parent).

J'ai essayé votre code et il semble se comporter comme prévu. En cliquant sur « l'étiquette d'image et le texte » il achemine l'arbre visuel: TextBlock -> StackPanel -> Étiquette -> Grille

+0

Pour clarifier: La valeur par défaut de RoutingStrategy affecte uniquement les nouveaux événements RoutedEvents que vous définissez. Les événements définis sur les contrôles existants définissent tous une valeur spécifique, dans de nombreux cas Bubble pour l'événement normal et Tunnel pour l'événement Preview associé. –

0

Le point est que je ne vois pas de différence/avantage des événements routés (à en juger par cet exemple) . En C# régulier, je ferais la même chose - ajouter un gestionnaire à chaque élément de mon formulaire (comme cela a été fait ici).

Le point de l'exemple est de montrer comment le marquage de l'événement comme manipulé affecte le comportement de routage. Si vous cochez la case "Gérer le premier événement", puis cliquez sur l'un des contrôles internes, l'événement est levé uniquement sur ce contrôle. Si vous le décochez, il est levé sur tous les contrôles de l'arbre visuel. La seule raison pour laquelle l'auteur de l'exemple gère l'événement sur chaque objet de l'arborescence est de le démontrer. Normalement, vous ne feriez pas cela; vous géreriez simplement l'événement au niveau le plus élevé utile.