1

実行時にデフォルトのウィンドウ スタイルを動的に更新して、実行時に FontSize と FontFamily を動的に変更できるようにしたいと考えています。リソース ディクショナリ内のスタイルは実行時に封印されており、変更できないことがわかったので、次の方法でスタイルを更新しました。

<Style TargetType="{x:Type Window}">
    <Setter Property="FontFamily" Value="Arial"/>
    <Setter Property="FontSize" Value="12pt"/>
</Style>

次のコードを使用します。

Style newStyle = (Make a copy of the old style but with the FontSize and FontFamily changed)

// Remove and re-add the style to the ResourceDictionary.
this.Resources.Remove(typeof(Window));
this.Resources.Add(typeof(Window), newStyle);

// The style does not update unless you set it on each window.
foreach (Window window in Application.Current.Windows)
{
    window.Style = newStyle;
}

このアプローチにはいくつかの問題があり、なぜそうなのかについていくつか質問があります。

  1. スタイルが実行時に封印されるのはなぜですか? また、封印を解除する方法はありますか?
  2. 新しいスタイルを再度追加すると、すべてのウィンドウでこれが反映されないのはなぜですか? すべてのウィンドウに手動で適用する必要があるのはなぜですか?
  3. より良い方法はありますか?
4

1 に答える 1

3

私はおそらく、さまざまな設定のプロパティを公開し、通常のバインドの場合と同様に INPC を起動する「設定サービス」でこれに取り組むでしょう。次に、そのスタイルを次のように変更します。

<Style x:Key="MyWindowStyle">
    <Setter Property="FontFamily" Value="{Binding Path=FontFamily, Source={StaticResource SettingsService}, FallbackValue=Arial}"/>
    <Setter Property="FontSize" Value="{Binding Path=FontSize, Source={StaticResource SettingsService}, FallbackValue=12}"/>
</Style>

「設定サービス」を静的リソースとして定義すると、次のようになります。

<services:SettingsService x:Key="SettingsService"/>

次に、各ウィンドウで、スタイルが DynamicResource として設定されていることを確認します。

<Window Style="{DynamicResource MyWindowStyle}" .... >

静的リソースと動的リソースの違いについては多くの誤解がありますが、基本的な違いは、静的は「1 回限りの」設定であるのに対し、動的はリソースが変更されると設定が更新されることです。

「設定サービス」でこれらのプロパティを設定すると、INPC が起動され、Style が更新され、DynamicResource がそれを取得して、それに応じて Window プロパティを変更します。

たいへんな作業のように思えますが、これにより優れた柔軟性が得られ、すべての「重い作業」は純粋に Binding を使用して行われます。現在取り組んでいるプロジェクトで同様の手法を使用しているため、ユーザーが塗りつぶし/線の色を選択すると、ツールバーのさまざまなツールが更新されて新しい値が反映されます。

于 2010-02-19T10:18:00.187 に答える