2017-12-29 80 views
0

WPF ComboBox用の再利用可能なテンプレートを作成しています。私は、動的テンプレートでこれらの参照を使用してフォントの色、背景、および境界線を変更することができる午前:c#WPF XAML ComboBox.ResourcesアイテムへのRelativeSourceの参照

Foreground="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBox}, Path=Foreground}" 
BorderBrush="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBox}, Path=BorderBrush}" 
Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBox}, Path=Background}" 

これらは私が参照できる性質を持っていたので、容易でした。私がやりたい何

<ComboBox Margin="90,62,0,0" Height="26" Width="302" 
      HorizontalAlignment="Left" VerticalAlignment="Top" 
      Focusable="False" IsReadOnly="True" MaxDropDownHeight="202" 
      Foreground="White" Background="SteelBlue" BorderBrush="White" 
      Style="{StaticResource ComboBoxFlatStyle}" 
      ItemContainerStyle="{StaticResource ComboBoxItemFlatStyle}"> 

は同様の方法で、次の参照です:

<ComboBox.Resources> 
    <SolidColorBrush x:Key="ComboBoxHighlightBrush" Color="RoyalBlue" /> 
</ComboBox.Resources> 

は、コントロール内のリソースを参照することが可能ですか?私は本当に別の色を使用して別のComboBoxでこのテンプレートを再利用できるようにしたい。

+0

Foreground = "{StaticResource ComboBoxHighlightBrush}"はあなたのコンボボックス内のものに適用されます。 – Milan

+0

@ミランNope、私は自分のアプリケーションリソースにスタイルを持っています。 –

+0

Foreground = "{DynamicResource ComboBoxHighlightBrush}"は、ブラシがapp.xamlリソースで定義されている場合に機能します。私は今あなたが実際にあなたのアプリケーションリソースの中ではなく、あなたのアプリケーションリソースの中にあるコンボボックスの中にあるリソースにアクセスしたいと思っています。これは実際にこのブラシをグローバルにアクセス可能にしたいという兆候ではありませんか? – Milan

答えて

0

答えは「いいえ」でしたが、ControlTemplatesは実行時にターゲットタイプのプロパティにバインドされていますか?だから私は、 "リソース"が実行時にComboBoxオブジェクトのアクセス可能なプロパティである限り、方法があると考えました。私は、「リソース」は、実行時に実際に読みやすい性質だったことsnoopを用いて検証:

enter image description here

リソースはただの辞書なので、私は、正確に定義されたリソースにコンボボックスのドロップダウンの背景を設定しようとしました - それはだ

Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Resources[ComboBoxHighlightBrush]}" 

は、これはおそらく、「リソース」はアクセスできないというあなたに、コンパイル時にエラーを与える:デフォルトのComboBoxコントロールテンプレートで「DropdownBorder」要素にこれらの属性を追加することで行ったのと同じ方法あなたが本当にあなたを構築することを妨げるエラーではありませんeソリューションを実行して実行します。実行時に、実際に動作することがわかります!

が動作しているにもかかわらず、これがテンプレートの再利用を可能にする最良の方法であるかどうかはわかりません。煩わしいコンパイル時のエラーの他に、テンプレートの消費者は、正しくキー付きのブラシをリソース辞書に追加するために、このマジック文字列を知る必要があります。

私は、次の点を考慮します:

  1. 軽く既存のUIコントロールの動作に追加する一般的な方法は、添付プロパティを使用することです。 ControlTemplatesの添付プロパティにバインドできます。あなたは何かを入力して、魔法の文字列に頼っていないこの方法です。
  2. カスタムコントロールでフルコントロールを作成します。私のUIプロジェクトでは、コンボボックスの上部にデフォルトのテキストまたはドッキングされたアイテムをドロップする必要があることが多いため、これらの機能を可能にする追加の依存プロパティを持つカスタムコントロールを作成しました。 WPFのComboBoxは私を箱から出させません。

編集あなたのコードに基づいて、私は上記ませんが、意味を成さない場合.. ControlTemplatesを使用して、あなたの質問の私の解釈が正しいことだと思います。もしそうなら、私もちょうど読みやすいどちらかといえば、おそらく代わりに

Foreground="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBox}, Path=Foreground}" 

Foreground="{TemplateBinding Foreground}" 

のようなバインディングを行う必要があります言及したいと思います。これはまた、より速いバインディングiircです。

+0

ちょうどテストされ、私は実際にコンパイルエラーはありませんでした。私にとっては、このテンプレートを使用している唯一の人であるため、これは非常にうまく機能します。ありがとう! –

+0

ええ、あなたが正しいです、私はそれを構築した直後に最初の "リソースにアクセスできません"が消えました。私はWPFのランダムではなく、実際にはエラーに慣れているので、私は結論に達したと思います。 :) – Rowbear

関連する問題