質問

デフォルトの Window スタイルを実行時に動的に更新して、実行時に 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. もっと良い方法はありますか?
役に立ちましたか?

解決

私はおそらく各種設定のためのプロパティを公開し、「設定サービス」でこれに取り組む、とあなたは、通常のバインディングと同じよう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時間」である。

あなたの「設定サービス」で、これらのプロパティを設定する場合は、

今、彼らはDynamicResourceが上をピックアップし、それに応じて画面のプロパティを変更しますスタイルを、更新なる、INPCを起動します。

は多くの作業のように思えるが、それはあなたにいくつかの素敵な柔軟性を与え、そしてすべての「力仕事は」バインディングを使用して、純粋に行われます。私たちは、ユーザーが充填/ストロークの色を選択すると、ツールバーのアップデートでは、さまざまなツールは、新しい値を反映するように、私は現時点でに取り組んでいるプロジェクトで同様の手法を使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top