私はカスタム WPF コントロールのスタイル セッターを作成しており、アプリケーション レベルで (アプリ全体のテーマ設定が有効になるように)理想的には (「できれば」と読む) 定義されるリソース (ブラシなど) に値を設定したいと考えています。1 つの例は次のようになります。
<Style.Triggers>
<DataTrigger Binding="{Binding IsInteresting}" Value="True">
<Setter Property="FontWeight" Value="Bold" />
<!-- Use the brush that is (hopefully) defined at the application-level -->
<Setter Property="Foreground" Value="{StaticResource InterestingBrush}" />
</DataTrigger>
</Style.Triggers>
リソースがまだアプリケーション レベルで定義されていない場合にスタイルを使用できるようにするために、Xaml でローカルにブラシを定義し、同じキーを持つリソースが他の場所では見つかりません。概念的に言えば、「定義されていない場合」のようなプリプロセッサ ディレクティブを使用することに似てい#ifndef
ます。
おそらく、これを行うためのメカニズムがすでに存在します。そうでない場合、どのように実装できますか?添付されたプロパティ/動作は何とかこれを行うことができますか? もしそうなら、私はその使用法が次のようになることを想定しています:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:HopefulBehaviors="clr-namespace:HopefulBehaviors"
xmlns:My_Controls="clr-namespace:My_Controls"
>
<!-- IDEA:
Attached property being used to "use the brush that is defined elsewhere
if it was found, if not use this locally-defined one" -->
<SolidColorBrush x:Key="InterestingBrush"
HopefulBehaviors:UseExternalIfFound="True" Color="Red" />
<Style TargetType="{x:Type My_Controls:AwesomeControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsInteresting}" Value="True">
<Setter Property="FontWeight" Value="Bold" />
<!-- now this brush would be defined (at least locally
but an external definition is used if it is found) -->
<Setter Property="Foreground" Value="{StaticResource InterestingBrush}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
回避策の 1 つは、一般的なカスタム コントロールの Style をかなり当たり障りのないままにしておき、そのアプリケーションに存在するリソースへの参照を使用するアプリケーションごとに、継承された Styles を作成することです。しかし、アプリケーション間でより一般化する、より洗練されたアプローチがあることを願っています。