2016-04-27 5 views
0

を設定した後、私はボタンのシンプルなトリガを持ってクリアトリガー:WPFコントロールは、コレクションがコントロールの背景

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

私はコードビハインドで、ボタンの背景を設定するまで、これは、素敵な作品:この後

neighborButton.Background = notClickedButtonBackground; 

neighborButton.Triggersコレクションが空になり、機能が失われます。 なぜその動作の原因ですか?

+1

[ "ローカル値" オーバーライドスタイルトリガセッター(https://msdn.microsoft.com/en-us/library/cc265148( v = vs95).aspx)。 XAMLのButton要素の属性に背景色を設定しても同じ効果が得られます。答えは、ロジックを公開するトリガーでコードを使用するか、プロパティを追加することですが、2つを組み合わせようとはしません。フレームワークと戦うとき、フレームワークは通常最後の笑いを得ます。 –

+0

ありがとう、それは私にとっては明らかではない。 – igorGIS

答えて

0

依存プロパティは、通常のC#プロパティよりはるかに複雑です。あなたがやっていることは、"Local value", which will override Style trigger setters.を設定することです。ブラシをXAMLのButton要素の属性に設定すると、同じ効果が得られます(ただし、コントロールの初期状態として取得できますなぜあなたの引き金が全く機能しないのかを尋ねる)。答えはすべてのコードを後ろに置くか、または論理を公開するためにプロパティを追加してトリガーで行いますが、2つを混ぜようとはしません。フレームワークと戦うとき、フレームワークは通常最後の笑いを得ます。フレームワークに関する私の正面攻撃は、最高でPyrrhic victories、そしてmore often debaclesでした。

私はコードビハインドでそれをすることはお勧めしませんが、すでにたくさんの時間を投資していれば、このプロジェクトでそれを守ることができます。しかし、それはマウスオーバーカラーを失うことを意味します。あなたはコードの中でそれをやってみるのは難しいでしょう。

DependencyObject.GetValue()DependencyObject.ReadLocalValue()の両方のMSDNページを見てみる価値があります。どちらも私が使用しています。

消えているトリガーで動作を再現することはできません。イベントハンドラでバックグラウンドを設定しても、まだトリガが1つあります。ただ効果がありません。

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}"; 
} 
関連する問題