2010-09-24 2 views
2

J'essaie de résoudre le problème suivant sur une grille de données WPF:Est-il possible qu'un clic sur un bouton modifie définitivement la source d'une image en utilisant uniquement un déclencheur XAML?

J'ai modélisé les éléments DataGrid pour qu'ils contiennent un bouton - quand ils sont cliqués, ils affichent les RowDetails pour la grille. J'ai de la difficulté à mettre ce bouton en forme comme je le veux. Plus précisément, je veux qu'il apparaisse comme un «lien hypertexte» avec une petite icône de signe plus à côté de lui. Lorsque vous cliquez sur pour afficher les RowDetails, cette icône doit être remplacée par un signe moins.

Voici le ControlTemplate que je tente d'appliquer au bouton:

<ControlTemplate x:Key="linkButtonTemplate" TargetType="{x:Type Button}"> 
    <StackPanel Orientation="Horizontal">      
      <Image x:Name="expanderIcon" Source="Images/Plus.png"/> 
      <TextBlock Foreground="Blue" TextDecorations="Underline" Padding="5 0 0 0"> 
       <ContentPresenter /> 
      </TextBlock>      
    </StackPanel> 
</ControlTemplate> 

Ainsi, lorsque le bouton est cliqué, je veux changer la propriété Source de cette image. Et quand on clique à nouveau, je veux le changer. J'ai trouvé les solutions suggérées suivantes, et aucun ne semble idéal:

1. Use a Trigger sur l'événement Button.IsPressed: Cela fonctionne! ... Sauf que l'image retourne une fois l'événement terminé. (c'est-à-dire une fois que la propriété IsPressed n'est plus vraie). Donc ça ne marche pas.

2. Utilisez un EventTrigger: Ces au moins vous permettent de prendre le événement Click Button ... et

Contrairement Trigger, EventTrigger n'a pas de concept de cessation de l'Etat, de sorte l'action sera ne pas être annulé une fois que la condition qui a déclenché l'événement n'est plus plus vrai.

Alors, génial! Mais ils semblent vous laisser seulement répondre avec des actions de Storyboard, pas un simple Setter de propriété. À moins que je ne manque quelque chose, ils ne sont pas destinés à ce scénario.

3. Utilisez un Attached Behavior: Je plonger actuellement dans cette option, mais je ne pas penser il devrait être un moyen de faire ce XAML contenu. Si non, qu'il en soit ainsi - j'apprendrai les comportements attachés.

Mais mon espoir est que quelqu'un a un angle sur ce que je n'ai pas rencontré. Par exemple, existe-t-il un moyen d'accrocher la propriété du DataRow contenant le bouton qui indique si les RowDetails sont actuellement consultables? On dirait que vous auriez besoin de casser le code derrière pour accomplir cela, aussi ... Ai-je tort?

Répondre

1

Vous pouvez utiliser un ToggleButton pour un scénario similaire à celui-ci et lier les visibilités des images à la propriété IsChecked. Il serait également beaucoup plus facile de lier la visibilité des RowDetails à cela.

+0

Ah bon appel!L'utilisation d'une alternative au bouton standard n'a pas été prise en compte. Merci. –

3

Je ne prétends pas que EventTriggers ne sont pas destinés à cela, les animations d'image unique sont très bien et peuvent même être trouvés dans les modèles par défaut de certaines commandes, par ex.

<VisualState Name="CalendarButtonFocused"> 
    <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="CalendarButtonFocusVisual" Storyboard.TargetProperty="Visibility" Duration="0"> 
      <DiscreteObjectKeyFrame KeyTime="0"> 
       <DiscreteObjectKeyFrame.Value> 
        <Visibility>Visible</Visibility> 
       </DiscreteObjectKeyFrame.Value> 
      </DiscreteObjectKeyFrame> 
     </ObjectAnimationUsingKeyFrames> 
    </Storyboard> 
</VisualState> 

Voici donc un exemple de la façon de changer la source de cette façon:

<Image Name="img" Source="C:\Users\Public\1.png"/> 
<Button Content="!"> 
    <Button.Triggers> 
     <EventTrigger RoutedEvent="Button.Click"> 
      <EventTrigger.Actions> 
       <BeginStoryboard> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.Target="{x:Reference img}" 
                 Storyboard.TargetProperty="Source"> 
          <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
           <DiscreteObjectKeyFrame.Value> 
            <BitmapImage UriSource="C:\Users\Public\2.png"/> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger.Actions> 
     </EventTrigger> 
    </Button.Triggers> 
</Button> 
Questions connexes