(WPF) ResourceDictionary から sys:Double の値を SystemFonts.MessageFontSize に設定するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2161960

質問

シナリオ:

WPF アプリケーションに 3 つの標準フォント サイズを使用したいと考えています。 BigFontSize, NormalFontSize, 、 そして SmallFontSize. 。これらは double 値であり、リソース ディクショナリでは次のように定義されます (ここで、 sys は適切に定義されます):

<sys:Double x:Key="BigFontSize">18</sys:Double>
<sys:Double x:Key="NormalFontSize">14</sys:Double>
<sys:Double x:Key="SmallFontSize">12</sys:Double>

これはうまくいきます。ただし、通常のサイズとしてランダムに 14 を選択しました。私が欲しいのは、システム定義のフォントサイズを取得することです NormalFontSize. 。(それができたら、コンバーターを使用できます) 説明どおり ここ 取得するため BigFontSize そして SmallFontSize に関連して NormalFontSize)


手がかり :

ドキュメントから、デフォルトのフォントサイズが静的プロパティ(double)に格納されていることがわかりました。 SystemFonts.MessageFontSize. 。しかし、その値をリソース ディクショナリに取得するにはどうすればよいでしょうか?(知っている Binding または DynamicResource 適用できません。しかし、これは静的な値なので、どうすれば適用できますか? StaticResource または x:Static それとも何でも?)

私が試してみました

<sys:Double x:Key="XXXFontSize">
    <StaticResource ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>

そして

<sys:Double x:Key="XXXFontSize">
    <x:Static ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>

どちらも(予想通り)機能しないようです。次のようなエラーが表示されます Cannot add content to object of type 'System.Double'.

注記:

  • コードから、たとえば App() からこれを実行したくありません。(ResourceDictionary の分離コードを使用することは可能ですか?)
  • これを、他のスタイルが派生できる一般化されたスタイルでカプセル化したくありません( BasedOn) いくつかのリソース ディクショナリがあるため、使用することはできません。 DynamicResourceBasedOn
    つまり使えない

    <Style x:Key="BigFont" TargetType="{x:Type Control}"}>
        <Setter Property="Control.FontSize" 
                Value="{Binding Source={x:Static SystemFonts.MessageFontSize},
                                Converter={ . . . }" />
    </Style>
    

    なぜなら、他の ResourceDictionary にスタイルがある場合、次のようになります。 HeaderTextBlockStyle, 、その場合は使用する必要があります BasedOn={DynamicResource BigFont} それは不可能です(私はそう思います)

ご協力をいただければ幸いです。
ありがとう。

タグ :WPF SystemFonts.MessageFontSize ResourceDictionary FontSize BasedOn DynamicResource

役に立ちましたか?

解決

私はこのようにやった...

public partial class GlobalResources : ResourceDictionary
{
    public GlobalResources()
    {
        this.Add("GiantFontSize", SystemFonts.MessageFontSize * 2.5);
        this.Add("BigFontSize", SystemFonts.MessageFontSize * 1.5);
        this.Add("MediumFontSize", SystemFonts.MessageFontSize * 1.25);
        this.Add("NormalFontSize", SystemFonts.MessageFontSize);
        this.Add("SmallFontSize", SystemFonts.MessageFontSize * 0.85);
    }
}

...それは奇跡のようのように働いています!私は同じ(部分)リソースディクショナリにまたはこのような他のリソースディクショナリからこれらのリソースを使用することができます...

<Style ...>
    <Setter Property="FontSize"
            Value="{DynamicResource MediumFontSize}" />

    ...

</Style>

私はそれが「良い習慣」かどうか(これにしてくださいコメント)であれば、私はそれが... !!!

を動作することを知っているか分かりません
scroll top