Frage

In meiner app habe ich Umschaltflächen die drei möglichen Zustände haben; „Nicht aktiviert“, „Karo“ und „Früher verwendete“. Wenn der Benutzer auf diesen speziellen Bildschirm kommt, werden einige der Umschaltflächen im „Früher verwendeten“ Zustand zu zeigen, was Arbeit getan wurde. Durch Klicken auf eine Schaltfläche mit Umschaltfunktion (unabhängig von der aktuellen Zustand) findet es in den „Checked“ Zustand. Nur eine dieser Umschaltflächen können gleichzeitig geprüft werden. Die verschiedenen Zustände werden durch verschiedene farbige äußere glow angezeigt ist, oder überhaupt kein Glanz.

Um den Schein nach außen für den „Checked“ Zustand gesetzt ich einen Trigger auf IsChecked verwenden euqals wahr.

<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>

Für den „Früher verwendeten“ Zustand ich den Schein nach außen in Code anwenden, nicht Markup. Ich muss dies tun, weil die Bestimmung, ob die Taste in diesem Zustand sein sollte, indem Sie Werte in einer Liste erfolgt.

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;
} 

Wenn jedoch eine umschaltbare Schaltfläche geklickt wird, wenn sie im „Früher verwendeten“ Zustand, wird der Auslöser keine Wirkung zu haben scheint. Der äußere Schein nicht ändert.

Was mache ich falsch? Wird ein Trigger nicht etwas bewirken, die nicht in XAML festgelegt hat?

War es hilfreich?

Lösung

Wenn Sie den DropShadowEffect auf dem Button gesetzt, Sie setzen den lokalen Wert der Button Unterkunft Effect, die ein DependencyProperty (Button.EffectProperty). Der lokale Wert hat Vorrang vor allen anderen möglichen Wert, bis es wie folgt gelöscht:

button1.ClearValue( Button.EffectProperty );

Allerdings macht, dass nur die Funktionsweise etwas gewunden, denn Sie müssen auch sicherstellen, dass Sie deutlich, wenn vor eingestellt wurde und wurde noch nicht gelöscht.

Stattdessen könnten Sie eine AttachedProperty PreviouslyUsed erstellen, die auf den ToggleButtons zu setzen und verwenden Bindings, so dass sie ihren Wert ein bisschen mehr automatisch erhalten. beziehen sich dann auf diesen AttachedProperty Wert in Ihre Trigger und Sie werden ein Schlagschatten für PreviouslyUsed haben, und eine andere für IsChecked.

Der Teil Sie Draht haben bis ist die Bindung, und Sie werden wahrscheinlich eine IValueConverter irgendwo zu drehen mViews[i].LocalizedName in eine true oder false für PreviouslyUsed verwenden.

Leider, ich weiß nicht genug über das Setup mit mViews und so zu mehr Beratung darüber anbieten. Ich weiß nicht ob Ihre ToggleButtons Teil von Datenbindung ist oder nicht. Ich vermute, dass sie nicht sind, wie Sie eine Reihe von ihnen zu sein scheinen iterieren. Wenn Sie Ihre mViews Objekte in die ItemsSource eines ListBox gebunden ist, zum Beispiel, könnten Sie eine DataTemplate erstellen, die die ToggleButtons mit dem AttachedProperty bereits an Ort und Stelle erzeugt. Das würde auch Ihre IsChecked Situation vereinfachen, indem sie verbindlich, ob dieses Element in den ListBox ausgewählt ist, und dann die ListBox kümmert, sicherzustellen, dass nur eine ausgewählt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top