2016-04-27 6 views
0

ich einen einfachen Auslöser für Taste haben:Wpf Steuerung löst Sammlung löscht nach Kontrolle Hintergrund Einstellung

<Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background" Value="#3E6DB6"/> 
     </Trigger> 
    </Style.Triggers> 

Das funktioniert schön, bis ich in Code-Behind-Schaltfläche Hintergrund:

neighborButton.Background = notClickedButtonBackground; 

Danach neighborButton.Triggers Sammlung wird leer und die Funktionalität ist verloren. Warum die Ursache für dieses Verhalten?

+1

[ "Lokale Werte" überschreiben Style-Trigger-Einrichter] (https://msdn.microsoft.com/en-us/library/cc265148 (v = vs.95) .aspx). Sie erhalten den gleichen Effekt, wenn Sie die Hintergrundfarbe in einem Attribut für das Button-Element in XAML festlegen. Die Antwort ist, Code hinter zu verwenden, oder fügen Sie Eigenschaften hinzu, um die Logik zu offenbaren, und zwar in Triggern, aber versuchen Sie nicht, die beiden zu mischen. Wenn man gegen den Rahmen kämpft, bekommt der Rahmen normalerweise das letzte Lachen. –

+0

Danke Ed, es ist nicht klar für mich. – igorGIS

Antwort

0

Abhängigkeitseigenschaften sind viel komplizierter als normale C# -Eigenschaften. Was Sie tun, ist eine "Local value", which will override Style trigger setters. Einstellung Sie würden den gleichen Effekt erhalten, wenn Sie die Background Pinsel in einem Attribut auf dem Button Element in XAML (aber Sie würden es als Ausgangszustand des Steuerelements erhalten, und Sie würden Fragen Sie hier, warum Ihr Auslöser überhaupt nicht funktioniert. Die Antwort besteht darin, alles hinter dem Code zu verbergen oder Eigenschaften hinzuzufügen, um die Logik zu offenbaren und dies in Triggern zu tun, aber versuche nicht, die beiden zu mischen. Wenn man gegen den Rahmen kämpft, bekommt der Rahmen normalerweise das letzte Lachen. Meine frontalen Angriffe auf den Rahmen waren bestenfalls Pyrrhic victories und more often debacles.

Ich empfehle nicht, es in Code hinter zu tun, aber wenn Sie schon eine Menge Zeit investiert haben, können Sie auch bei diesem Projekt bleiben. Das bedeutet jedoch, dass Sie Ihre Mouseover-Farben verlieren. Sie würden verrückt sein, das im Code dahinter zu versuchen.

Es lohnt sich, einen Blick auf die MSDN-Seiten für DependencyObject.GetValue() und DependencyObject.ReadLocalValue() zu werfen, die beide unten verwendet werden.

Ich kann Ihr Verhalten nicht mit den verschwindenen Triggern reproduzieren. Ich habe immer noch einen Trigger, nachdem ich den Hintergrund im Event-Handler gesetzt habe. Es hat nur keinen Effekt.

XAML:

<Button 
    Click="Button_Click" 
    Content="Click Me" 
    > 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="#3E6DB6" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

C#:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var btn = sender as Button; 
    var triggers = btn.Style.Triggers; 

    // GetValue returns the "effective value": Maybe local, maybe not; 
    // whatever it is, it's the value that will be used. 
    var background = btn.GetValue(Button.BackgroundProperty); 

    // If there's a local value, it overrides whatever else has been set. 
    // Note that a value set by a template trigger on a property of an 
    // element within the template is a local value. 
    var localbackground = btn.ReadLocalValue(Button.BackgroundProperty); 

    // Right now, 
    //  background == #FF3E6DB6 
    //  localbackground == DependencyProperty.UnsetValue 

    btn.Background = new SolidColorBrush(Colors.YellowGreen); 

    background = btn.GetValue(Button.BackgroundProperty); 
    localbackground = btn.ReadLocalValue(Button.BackgroundProperty); 

    // Now they're both #FF9ACD32, which is YellowGreen 
    // triggers.Count == 1 

    btn.Content = $"Trigger count: {triggers?.Count}"; 
} 
Verwandte Themen