私の問題:
特定のコントロールをターゲットとするスタイルのプロパティ Aのセッターの 'Setter.Value' フィールド内で、その特定のコントロールのプロパティ Bにバインドする方法を理解できませんでした。より具体的には、ボタンのコンテンツ プロパティのビジュアル ツリー内のグラフィカル要素でフォアグラウンド ブラシの値を使用したいと考えています。これにより、グラフィカル要素には常にこのボタン コントロールの前景色が設定されます。
私が達成しようとしていること:
私は3つのボタンコントロールを持つWPFアプリケーションに取り組んでいます:
- デフォルトボタン
- 特殊ボタン
- 拡張特殊ボタン
DefaultButtonは、ControlTemplate を使用してアプリケーションのボタンのスタイルを定義する場所です。
SpecialButtonは、一般的なボタンには使用されない新しいプロパティを導入します。このプロパティは、スタイル セッターを通じて定義する 1 つの視覚的状態によって表されます。それ以外の場合、外観は DefaultButton と同じです。
DefaultButton のスタイルに基づいて、この SpecialButton のスタイルを定義します。このスタイルでは、ControlTemplate はなく、いくつかのビジュアル プロパティを設定するいくつかのプロパティ条件に基づいて、MultiTrigger 応答のみがあります。
<Style x:Key="SpecialButtonStyle" TargetType="{x:Type MyControls:SpecialButton}" BasedOn="{StaticResource DefaultButtonStyle}">
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsActive" Value="false"/>
<Condition Property="IsMouseOver" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="BorderBrush" Value="{DynamicResource ButtonDisabledBorder}" />
<Setter Property="Background" Value="{DynamicResource ButtonDisabledBg}" />
</MultiTrigger>
</Style.Triggers>
</Style>
これはすべてうまくいきました。
次のステップも問題ありません。ExtendedSpecialButton を SpecialButtonに基づいて作成し、ボタン内にデフォルトの形状コンテンツを設定したかったのです。
<Style x:Key="ExtendedSpecialButtonStyle" TargetType="{x:Type MyControls:ExtendedSpecialButton}" BasedOn="{StaticResource SpecialButtonStyle}">
<Setter Property="Content">
<Setter.Value>
<Rectangle Fill="Black" Height="5" Width="15"></Rectangle>
</Setter.Value>
</Setter>
</Style>
DefaultButton の元のスタイルは引き続き存在します。SpecialButton の IsActiveProperty に応答する追加の視覚的状態は引き続き存在し、ExtendedSpecialButton も、SpecialButton の MultiTrigger によって作成された視覚的動作を継承しています。
また、この ExtendedSpecialButton に必要なグラフィカル要素も正常に表示されました。
ただし、このグラフィカル要素の塗りつぶしに前景色を使用したかったのです。この前景色は、もともと DefaultButton でスタイル設定されており、最初の 2 つのボタンでうまく機能します。
以下のコードは、そのようなバインディングを行うべきだと私が現在考えている方法です。しかし、これは機能しません:
<Style x:Key="ExtendedSpecialButtonStyle" TargetType="{x:Type MyControls:ExtendedSpecialButton}" BasedOn="{StaticResource SpecialButtonStyle}">
<Setter Property="Content">
<Setter.Value>
<Rectangle Fill="{Binding RelativeSource={RelativeSource TemplatedParent}}" Height="6" Width="20"></Rectangle>
</Setter.Value>
</Setter>
</Style>
意図したとおりにバインディングをセットアップするために何ができるか知っている人はいますか?