2016-03-23 15 views
1

依存プロパティの値の優先順位に従って、ローカルテンプレートの値はコントロールテンプレートよりも優先されます(https://msdn.microsoft.com/fr-fr/library/ms743230%28v=vs.85%29.aspx参照)。バックグラウンドとコンテンツがコントロールテンプレートで指定されている場合、ボタンコントロールのBackgroundプロパティとContentプロパティのローカル値が設定されていません。

以下「TemplateContent」であるとして

しかし、以下の私の例では、ボタンコントロールの内容と背景のプロパティがコントロール要素locally.Backgroundでこれらのプロパティを指定するにもかかわらず、コントロールテンプレートから設定されているがオレンジやコンテンツを設定されていますXAML:ローカル値は、依存関係プロパティ値の優先順位で上位の優先順位を持つにもかかわらず影響を与えていない理由を制御template.Butで使用されているTemplateBindingのとき

<Window.Resources> 
     <ControlTemplate x:Key="ButtonTemplate" TargetType="Button" >    
      <Border CornerRadius="10" Width="100" Height="50" Background="Orange"> 
       <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Content="TemplateContent" /> 
      </Border> 
     </ControlTemplate> 
    </Window.Resources> 

<Button Template="{StaticResource ButtonTemplate}" Background="Blue" Grid.Row="2" Grid.Column="0" Content="LocalContent" Width="100" Height="100" HorizontalAlignment="Center"> 

は私も理解してローカル値が影響を与える可能性があり

+2

テンプレートをカスタマイズできるようにするには、テンプレートバインディングを使用する必要があります。 'Orange'を' {TemplateBinding Background} 'に置き換えてみてください。デフォルトではオレンジ色にする必要がある場合は、スタイルを指定してスタイルを指定します。スタイルはテンプレートを設定することもできるため、明示的に行う必要はありません。 –

答えて

1

残念ながら、この点については、MSDNのドキュメントはあまり明確ではなく(「よくあることですが」)、「ローカル値」という意味を誤解しています。

例では、XAMLのBorderオブジェクトのBackgroundプロパティの割り当てが問題の「ローカル値」です。そして、これは確かに優先されます。たとえ、 Styleセッターがそのプロパティの値を設定しようとしましたが、ローカルにプロパティ値を"Orange"に設定しているため、失敗します。

Button要素のBackground="Blue"は、の値を完全に異なるプロパティに設定します。私。 Borderオブジェクトではなく、Buttonオブジェクトのプロパティです。この割り当ては、実際にはでもの優先順位が高くなりますが、その特定のプロパティを設定する可能性のあるもの(たとえば、Buttonスタイル)にのみ適用されます。テンプレートに含まれる全く異なるオブジェクト(つまり、Border)には影響しません。

この正確な目的のために{TemplateBinding ...}マークアップが存在します。あなたはこのようなあなたのテンプレートを宣言する場合:

<ControlTemplate x:Key="ButtonTemplate" TargetType="Button"> 
    <Border CornerRadius="10" Width="100" Height="50" 
      Background="{TemplateBinding Background}"> 
    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" 
         Content="TemplateContent"/> 
    </Border> 
</ControlTemplate> 

その後、WPFはTemplatedParentオブジェクトに見て知っている、特にそのBackgroundプロパティ、Border.Backgroundプロパティ値を設定する値を見つけることでしょう。

+0

どのように優先順位が働くかを考えれば、デフォルト(オレンジ色)は、それぞれの 'Setter'を持つ' Button'スタイルで設定する必要があることに注意する価値があります。 –

+1

@H:ご使用の提案に同意しますが、回答に追加することが有用かどうかはわかりません。私は元の質問の青とオレンジの色は、おそらく青が国境に影響を与えていないことを明確に説明していると思います。私は意図が本当にオレンジ色のデフォルトの背景色を提供するのかどうかはわかりません(私はそれも確かにわかりません)。主に、私は主な点の難読化を危険にさらし、答えにあまりにも詳細を追加することについて常に心配しています。そのような追加情報を明確で混乱を避けて紹介する方法があれば、私はあなたの編集を歓迎します。 –

関連する問題