WPF FontSize and FontFamily
-
Hallo zusammen.
Ich habe in meinem WPF Projekt global meine Schriftart und Schriftgröße für einen Textblock definiert
<System:Double x:Key="StandardFontSize">12</System:Double> <System:Double x:Key="Header1FontSize">18</System:Double> <System:Double x:Key="Header2FontSize">16</System:Double> <FontFamily x:Key="StandardFontFamily">Verdana</FontFamily> <Style TargetType="{x:Type TextBlock}"> <Setter Property="FontFamily" Value="{StaticResource StandardFontFamily}" /> <Setter Property="FontSize" Value="{StaticResource StandardFontSize}" /> </Style>
Das funktioniert auch soweit.
Nun will ich bei bestimmten Texten die Größe ändern.
Dazu ein Beispiel wie folgt:
<Label HorizontalAlignment="Center" VerticalAlignment="Center" Content="Das ist eine Überschrift" FontSize="{StaticResource Header1FontSize}" />
Das Label wird nun aber in der Standardgröße ausgegeben.
Wieso dachte eigentlich dass das lokal gesetzte Property Vorrang hat?
-
Eigentlich müsste ich ja für das Label das hier implementieren
<Style TargetType="{x:Type Label}"> <Setter Property="FontFamily" Value="{StaticResource StandardFontFamily}" /> <Setter Property="FontSize" Value="{StaticResource StandardFontSize}" /> </Style
Und sobald ich das hier herausnehme:
<Style TargetType="{x:Type TextBlock}"> <Setter Property="FontFamily" Value="{StaticResource StandardFontFamily}" /> <Setter Property="FontSize" Value="{StaticResource StandardFontSize}" /> </Style>
geht es.
Was ich hier nicht verstehe wieso setzt Textblock den Style für ein Label.
Und überschreibt dazu auch noch den lokalen Style.
-
Ich habe es mal ausprobiert und kann es nicht nachvollziehen.
Hat dein Label auch die Chance die Resourcen zu erreichen?
Wo liegen die Resourcen und wo das Label das sich nicht anpasst? (Wichtig sind auch die Projekte)Bei mir grad (Beides in dem selben Application Projekt):
App.xaml
<Application.Resources> <System:Double x:Key="StandardFontSize">12</System:Double> <System:Double x:Key="Header1FontSize">18</System:Double> <System:Double x:Key="Header2FontSize">16</System:Double> <FontFamily x:Key="StandardFontFamily">Verdana</FontFamily> <!-- Dieser Style wirkt auch --> <!--<Style TargetType="{x:Type Label}"> <Setter Property="FontFamily" Value="{StaticResource StandardFontFamily}" /> <Setter Property="FontSize" Value="{StaticResource StandardFontSize}" /> </Style>--> <Style TargetType="{x:Type TextBlock}"> <Setter Property="FontFamily" Value="{StaticResource StandardFontFamily}" /> <Setter Property="FontSize" Value="{StaticResource StandardFontSize}" /> </Style> </Application.Resources>
MainWindow.xaml
<StackPanel> <Label HorizontalAlignment="Center" VerticalAlignment="Center" Content="Das ist eine Überschrift" FontSize="{StaticResource Header1FontSize}" /> <TextBlock Text="Das ist ein Normaler Text" /> </StackPanel>
Funktioniert wie erwartet.
-
Hat dein Label auch die Chance die Resourcen zu erreichen?
Ja hat es. Ich habe zum Test die Resourcen in die gleiche Datei gelegt.
Habe nun mal auch ein komplett neues Projet angelegt und hier funktioniert es auch wie erwartet.
Nur halt in meinem großen Projekt nicht. Versteh das nicht. Irgendwas wird da überschrieben und ich finde es nicht. Woran könnte den so was liegen?
-
Nochmal was dazu:
Hat dein Label auch die Chance die Resourcen zu erreichen?
Habe in meinem Window nur folgenden Code drinne:
<Label Content="Überschrift" FontSize="25" />
Keine Resourcen und keine Verweise zu anderen Dateien. Der Text wird aber genau so groß dargestellt wie im Textblock definiert
<Style TargetType="{x:Type TextBox}"> <Setter Property="FontSize" Value="8" /> </Style>
Egal wo diese Resource definiert ist im Projekt. Sobald ich den Abschnitt lösche hat mein Label die Schriftgröße 25.
-
Gerade auch nochmal ausprobiert, mit dem was du gegeben hast.
Mir ist dabei aufgefallen das es im Designer groß Gerendert wird, aber nicht zur Laufzeit.
Kann sein das mein letzter Test deswegen falsch war, hatte es nur im Designer betrachtet.Das Problem ist folgendes:
Ein Label ist ja ein ContentControl, d.h. man kann da alles mögliche rein packen.
Wenn du dir nun das Label mal mit Snoop anschaust, wirst du feststellen das dass Label intern ein TextBlock zur Darstellung verwendet.
Ich finde es schade das sich die FontSize bei diesem Fall nicht durch "erbt", hätte ich sogar erwartet, aber ich vermute das ist der Preis den man zahlt wenn man solch ein globalen Style erstellt.Du kannst es so lösen indem du entweder direkt ein TextBlock statt ein Label verwendest, dann kannst du FontSize überschreiben, oder du ein TextBlock in dem Label selber platzierst, da kannst du dann die Größe auch überschreiben.
<TextBlock Text="Überschrift" FontSize="25" /> oder <Label> <Label.Content> <TextBlock Text="Überschrift" FontSize="25" /> </Label.Content> </Label>
Wenn du aber schon die Font derartig global hast, kannst du so eine globale mit nem Key auch für Überschriften festlegen.
-
Bei mir ist das bei meinem großen Projekt so. Da wird die Schrift auch nur im Designer groß gerendert. Zur Laufzeit ist sie dann wieder klein.
Doch in meinem Beispiel geht es ja. Also zur Designtime und Runtime. Das ist ja das seltsame.
Bei dir gehts aber auch nicht zur Laufzeit.