2009-10-04 5 views
1

Im faire un bouton personnalisé appelé « ShardButton » qui utilise un style pour contrôler son contenu ainsi que son événement déclenche:simple question de l'événement WPF avec contrôle personnalisé

<Style x:Key="ButtonStyle" TargetType="{x:Type obj:ShardButton}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type obj:ShardButton}"> 
       <Grid> 
        <Path .../> 
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
             VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
             SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
             RecognizesAccessKey="True"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <EventTrigger RoutedEvent="ButtonBase.Click"> 
         !!!SOMETHING HERE!!! 
        </EventTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Im en utilisant le XAML ci-dessus dans la principale Window1 Fichier .xaml, et en créant un xmlns à l'espace de noms "obj", donc ce que je veux faire est d'appeler une méthode de gestion d'événements personnalisés sur la classe ShardButton, comment puis-je faire cela en XAML?

Je ne peux pas l'air de trouver la bonne façon de l'exprimer pour une recherche Google ...

Merci pour toute aide que vous pouvez me donner!

Mark

Répondre

1

Vous ne pouvez pas exécuter directement des gestionnaires d'événements dans eventtriggers, ils were'nt créé à cet effet. Cependant, si chaque instance de votre ShardButton doit faire la même chose sur clic, remplacez simplement la méthode OnClick dans votre classe ShardButton et faites ce que vous avez à faire ici.

Si vous ne désirez pas ce comportement, mais veulent plutôt avoir un gestionnaire spécifique exécuté pour chaque instance ShardButton qui utilise ce style spécifique défini dans Window1.xaml, ajouter un autre compositeur:

<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type obj:Window1}}, Path=MyCommand}" /> 

Où MyCommand est une propriété d'occurrence de Window1 retournant une implémentation personnalisée de ICommand qui appellera votre gestionnaire. Cette ligne de code suppose que chaque bouton utilisant ce style est quelque part dans l'arbre visuel de Window1, ce qui devrait être le cas (ou le style serait défini ailleurs).

+0

Merci! MyCommand retourne une implémentation ICommand, mais comment puis-je retourner le cliqué sur la méthode OnClick de Button? – Mark

+0

Je ne suis pas sûr si je comprends bien votre commentaire. Si vous surchargez OnClick directement (commande commune à tous les boutons) sur votre ShardButton, vous n'avez besoin d'utiliser aucune commande, c'est pour le second cas (commande spécifique à un style). –

+0

Ah je vois ce que tu dis, tu me manques en lisant ton post. Merci pour la clarification. – Mark

0

Vous pouvez utiliser un EventSetter dans votre Style:

<Style ...> 
    <EventSetter Event="Click" Handler="yourHandlerMethod"/> 
</Style> 

Puis dans votre code-behind:

private void yourHandlerMethod(object sender, RoutedEventArgs e) 
{ 
    ... 
} 
+0

Salut Kent, le problème était que j'avais besoin de cette méthode dans une autre classe, le ShardButton, dans ce cas, qui étend Button. – Mark

Questions connexes