2009-08-06 5 views
0

Dans mon application, j'ai des boutons qui ont trois états possibles; "Non coché", "Coché" et "Utilisé précédemment". Lorsque l'utilisateur arrive à cet écran particulier, certains des boutons bascule seront dans l'état "précédemment utilisé" pour montrer ce qui a été fait. Cliquer sur un bouton bascule (peu importe l'état actuel) le placera dans l'état "Vérifié". Un seul de ces boutons à bascule peut être vérifié à la fois. Les différents états sont indiqués par une lueur externe de couleur différente, ou aucune lueur du tout.Les déclencheurs WPF affectent les valeurs définies dans le code, pas XAML

Pour définir la lueur externe pour l'état "Vérifié", j'utilise un déclencheur sur Isqals IsChecked vrai.

<ControlTemplate.Triggers> 
    <Trigger Property="IsChecked" Value="True">       
     <Setter Property="Effect"> 
     <Setter.Value> 
      <DropShadowEffect Color="Salmon" BlurRadius="40" ShadowDepth="0" Opacity="1.0"></DropShadowEffect> 
     </Setter.Value> 
     </Setter> 
    </Trigger>       
</ControlTemplate.Triggers> 

Pour l'état "précédemment utilisé", j'applique la lueur externe dans le code, pas de balisage. Je dois le faire parce que déterminer si le bouton devrait être dans cet état est fait en vérifiant les valeurs dans une liste.

if (mExistingViews.Contains(mViews[i].LocalizedName)) 
{ 
    DropShadowEffect dse = new DropShadowEffect(); 
    dse.ShadowDepth = 0; 
    dse.BlurRadius = 20; 
    dse.Opacity = 1.0; 
    dse.Color = Colors.Yellow; 
    mViewButtons[i].Effect = dse; 
} 

Cependant, lorsqu'un bouton bascule est cliqué dans l'état « Auparavant utilisé », le déclencheur ne semble pas avoir d'effet. La lueur externe ne change pas.

Qu'est-ce que je fais mal? Est-ce qu'un déclencheur n'affecte pas quelque chose qui n'a pas été défini dans XAML?

+1

Quand votre code définissant l'effet est-il exécuté? Je soupçonne que ce qui se passe est que votre déclencheur est appliqué, puis votre code s'exécute et écrase l'effet. –

+0

Mon code s'exécute lorsque l'écran est mis en vue pour la première fois. Les déclencheurs ne sont appliqués que lorsque l'utilisateur clique sur l'un des boutons.Donc, il ne devrait pas être le cas que le déclencheur est écrasé. –

+1

@Dan: Pavel signifie que votre déclencheur 'ControlTemplate' est écrasé. Un meilleur mot serait supprimé. La définition de 'Effect' dans le code définit une valeur locale. Lisez ceci: http://www.wpftutorial.net/DependencyProperties.html –

Répondre

2

Une fois que vous définissez la DropShadowEffect sur le Button, vous définissez la valeur locale de la propriété de EffectButton, qui est un DependencyProperty (Button.EffectProperty). La valeur locale remplace toute autre valeur possible jusqu'à ce qu'elle soit effacée comme ceci:

button1.ClearValue(Button.EffectProperty); 

Cependant, cela fait juste le fonctionnement un peu plus alambiquée, parce que vous avez également videz si a été mis en avant et hasn pas encore été nettoyé. Au lieu de cela, vous pouvez créer une propriété jointe PreviouslyUsed à placer sur les ToggleButton s et utiliser Bindings afin qu'ils obtiennent leur valeur un peu plus automagiquement. Ensuite, faites référence à cette valeur AttachedProperty dans vos déclencheurs et vous aurez une ombre portée pour PreviouslyUsed, et une autre pour IsChecked.

La partie que vous aurez à câbler est la liaison, et vous aurez probablement utiliser un endroit IValueConverter pour transformer mViews[i].LocalizedName en true ou false pour PreviouslyUsed.

Malheureusement, je ne connais pas assez votre installation avec mViews et autres pour offrir plus de conseils à ce sujet. Je ne sais pas si vos ToggleButtons font partie de la liaison de données ou non. Je soupçonne qu'ils ne le sont pas, car vous semblez en répéter une série. Si vous avez lié vos objets mViews au ItemsSource d'un ListBox, par exemple, vous pouvez créer un DataTemplate qui génère le ToggleButtons avec le composant AttachedProperty déjà en place. Cela simplifierait également votre situation IsChecked en liant le fait que cet élément soit sélectionné ou non dans le ListBox, puis le ListBox s'assurera qu'un seul est sélectionné.

Questions connexes