(WPF) Wie Sollwert eines sys: Double zu SystemFonts.MessageFontSize von Resource?
-
23-09-2019 - |
Frage
Szenario:
Ich möchte für meine WPF-Anwendung 3 Standard-Schriftgröße: BigFontSize
, NormalFontSize
und SmallFontSize
. Dies sind doppelt Werte, und sie sind in den Ressourcen Wörterbuch definiert als (wo sys
wird in geeigneter Weise definiert):
<sys:Double x:Key="BigFontSize">18</sys:Double>
<sys:Double x:Key="NormalFontSize">14</sys:Double>
<sys:Double x:Key="SmallFontSize">12</sys:Double>
Das funktioniert gut. Aber ich habe zufällig 14 als normale Größe ausgewählt. Was ich will, ist ein System definiert Schriftgröße für NormalFontSize
zu bekommen. (Wenn das erledigt ist, kann ich einen Konverter verwenden wie hier BigFontSize
und SmallFontSize
relativ zu NormalFontSize
)
Clue:
fand ich aus der Dokumentation, dass Standardschriftgröße in eine statische Eigenschaft (double) SystemFonts.MessageFontSize
gespeichert ist. Aber was soll ich tun, diesen Wert auf Ressourcenverzeichnis abzurufen? (Ich weiß, Binding
oder DynamicResource
nicht angewandt werden kann. Aber hey, das ist ein statischer Wert, so wie kann ich mich bewerben StaticResource
oder x:Static
oder was auch immer?)
Ich habe versucht,
<sys:Double x:Key="XXXFontSize">
<StaticResource ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
und
<sys:Double x:Key="XXXFontSize">
<x:Static ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
Beide, die nicht zur Arbeit erscheinen (wie erwartet). Ich erhalte eine Fehlermeldung, dass Cannot add content to object of type 'System.Double'.
Hinweis:
- Ich mag nicht, diese von Code zu tun, beispiel aus dem App (). (Ist es möglich, einen Code-behind für Resource haben?)
-
Ich möchte nicht, diese in generali Stil verkapseln, von denen andere Arten abgeleitet werden kann (mit
BasedOn
), weil ich mehrere Ressourcen Wörterbücher haben, und es wird nicht möglich sein,DynamicResource
zu verwenden, um mitBasedOn
Das heißt, ich kann nicht verwenden<Style x:Key="BigFont" TargetType="{x:Type Control}"}> <Setter Property="Control.FontSize" Value="{Binding Source={x:Static SystemFonts.MessageFontSize}, Converter={ . . . }" /> </Style>
Weil, wenn ich einen Stil in anderen Resource haben,
HeaderTextBlockStyle
sagen, dann würde ich auf den EinsatzBasedOn={DynamicResource BigFont}
haben, die nicht möglich ist (glaube ich)
Jede Hilfe wäre sehr geschätzt.
Danke.
TAGS : WPF SystemFonts.MessageFontSize Resourcefontsize BasedOn Dynamic
Lösung
Ich habe so gemacht ...
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);
}
}
... und es funktioniert wie ein Wunder !!! Ich kann diese Ressourcen in dem gleichen (teilweise) Ressourcenverzeichnis oder von anderen Ressourcen Wörterbücher wie diese ...
<Style ...>
<Setter Property="FontSize"
Value="{DynamicResource MediumFontSize}" />
...
</Style>
Ich weiß nicht, ob es eine „gute Praxis“ ist oder nicht (bitte Kommentar zu diesem Thema), ich weiß nur, dass es funktioniert .. !!!
Andere Tipps
Schauen Sie sich diesen Artikel: außer Kraft setzen Standardstile kann es haben, was Sie suchen.