Question

Dans mon application, j'ai des boutons à bascule qui ont trois états possibles; « Non contrôlé », « vérifié » et « Auparavant utilisé ». Lorsque l'utilisateur vient à cet écran particulier, certains des boutons à bascule sera dans le « Auparavant utilisé » état de montrer ce travail a été fait. En cliquant sur un bouton à bascule (pas de la matière de l'état actuel) placera dans l'état « vérifié ». Un seul de ces boutons à bascule peuvent être vérifiés à la fois. Les différents états sont indiqués par différentes lueur externe de couleur, ou pas du tout éclat.

Pour définir la lueur extérieure de l'état « checked » J'utilise un déclencheur sur IsChecked euqals 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 la « Auparavant utilisé » état dans lequel j'applique la lueur externe dans le code et non du balisage. Je dois le faire parce que déterminer si le bouton doit être dans cet état se 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 un élément déclencheur pas d'effet quelque chose qui n'a pas été mis en XAML?

Était-ce utile?

La solution

Une fois que vous définissez la DropShadowEffect sur le Button, vous définissez la valeur locale de la propriété Button du Effect, qui est un DependencyProperty (Button.EffectProperty). La valeur locale l'emporte sur 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 aussi devez videz si a été mis en avant et n'a pas encore été éclairci.

Au lieu de cela, vous pouvez créer un PreviouslyUsed de AttachedProperty à mettre sur les ToggleButtons et utiliser Bindings afin qu'ils obtiennent leur valeur un peu plus automagiquement. Reportez-vous ensuite à cette valeur AttachedProperty dans vos déclencheurs et vous aurez une ombre pour PreviouslyUsed, et un autre pour IsChecked.

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

Malheureusement, je ne sais pas assez sur votre configuration avec mViews et comme d'offrir plus de conseils à ce sujet. Je ne sais pas si votre ToggleButtons font partie de la liaison de données ou non. Je pense qu'ils ne sont pas, comme vous semblez itérer un tableau d'entre eux. 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 AttachedProperty déjà en place. Cela permettrait également de simplifier votre situation IsChecked en se liant à ou non cet élément est sélectionné dans le ListBox, puis le ListBox prend soin de faire en sorte que seul est sélectionné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top