[WPF] FontSize van TextBlock in static class veranderen

Pagina: 1
Acties:

Onderwerpen


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Hoi,

Ik ben een WPF applicatie aan het schrijven die een aantal vensters met informatie toont die een gebruiker tijdens het spelen van een spel moet kunnen lezen. In de opties van m'n applicatie wil ik de gebruiker de mogelijkheid geven om de font size van de meeste informatie aan te passen, indien hij niet groot genoeg is om tijdens het spelen snel te kunnen lezen. Ik heb daarvoor een simpele FontSize setting aangemaakt (op de normale manier via de project properties - Settings tab). Naast een standaard font size bereken ik dan ook automatisch een iets grotere en iets kleinere size voor bijvoorbeeld headers / subtext. Die bereken ik aan de hand van de normale font size (80% en 120% van de normale, bijvoorbeeld).

Mijn idee is nu om in alle TextBlocks (en andere elementen die informatie tonen die belangrijk is tijdens het spelen) de FontSize een waarde te geven uit een static class:

code:
1
2
<TextBlock Text="Test" FontSize="{x:Static FontSizes.Normal}" />
<TextBlock Text="Subtext" FontSize="{x:Static FontSizes.Small}" />


De FontSizes class heeft gewoon 3 static read-only properties die de waarde uit de settings teruggeven:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static class FontSizes
{
    public static double Normal
    {
        get { return Properties.Settings.Default.FontSize; }
    }

    public static double Small
    {
        get { return 0.8 * Normal; }
    }

    public static double Large
    {
        get { return 1.2 * Normal; }
    }
}


Hoewel dit prima werkt, is het niet mogelijk om de fontsize tijdens het draaien van de applicatie aan te passen. Pas na een restart word de nieuwe font size gebruikt om de elementen te renderen.

Ik snap dat dit komt omdat de elementen nooit zullen weten dat de font size veranderd is, ze lezen gewoon 1 keer uit wat de waarde in de settings is, maar als de settings veranderen weten ze dat niet en zullen ze niet updaten.

Ik zou echter graag willen dat de elementen toch meteen updaten. Voor zover ik weet doe je dit normaal met (two-way) databinding, maar ik kan niet databinden op een static class voor zover ik weet..?

Om het zonder databinden te doen probeer ik gewoon de elementen te "refreshen" wanneer de opties aangepast zijn. Dat werkt echter ook niet. Ik heb geprobeerd op het top-level element een UpdateLayout aan te roepen, wat niets uithaalde. Daarna heb ik geprobeerd door de hele VisualTree te lopen en op elk element opnieuw UpdateLayout aan te roepen, ook dat werkt niet. Naast UpdateLayout heb ik nog meerdere methodes geprobeerd die misschien de nieuwe fontsize zouden gaan inlezen, maar niks lijkt te werken.

De enige optie die ik nog kan bedenken is om handmatig de FontSize te gaan zetten (bij het lopen door de VisualTree), maar dat is eigenlijk geen optie omdat niet ELK element deze FontSize moet hebben, enkel die elementen waarvan ik dat in de XAML zeg (via de {x:Static ...} waarde). Dus dat gaat ook niet..


Weet iemand een goede manier om dit op te lossen? Bedankt!

Mijn iRacing profiel


  • beany
  • Registratie: Juni 2001
  • Laatst online: 16:42

beany

Meeheheheheh

Is DynamicResource niet een oplossing? En dan Style's maken ipv static's.

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

DependencyProperties zijn static, kan je die niet gebruiken?

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
beany schreef op donderdag 22 december 2011 @ 12:08:
Is DynamicResource niet een oplossing? En dan Style's maken ipv static's.
Hoe haal ik dan de fontsize uit de project settings in een style?
Boeboe schreef op donderdag 22 december 2011 @ 12:13:
DependencyProperties zijn static, kan je die niet gebruiken?
Dan moet ik dus ook een DependencyObject hebben om de GetValue en SetValue op te doen, wat gebruik ik daar dan voor? Of bedoel je het op een andere manier..?

Mijn iRacing profiel


  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

heb het zelf nog niet geprobeerd om de hele property static te maken, maar de standaard propdp snippet lijkt me toch werkbaar?
Properties class geeft geen change notifications door, nevermind :x

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


  • beany
  • Registratie: Juni 2001
  • Laatst online: 16:42

beany

Meeheheheheh

NickThissen schreef op donderdag 22 december 2011 @ 12:37:
[...]

Hoe haal ik dan de fontsize uit de project settings in een style?
In een style kan je refereren naar Static objecten.

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Ik zal het zometeen eens proberen. Maar hoe krijgt de style dan te weten dat de settings veranderd zijn? Zit ik dan niet met hetzelfde probleem?

Mijn iRacing profiel


  • SaphuA
  • Registratie: September 2005
  • Laatst online: 10-09 22:00
.

[ Voor 100% gewijzigd door SaphuA op 31-01-2022 15:41 ]


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
SaphuA schreef op donderdag 22 december 2011 @ 13:06:
Kun je niet een soort singleton maken die INotifyPropertyChanged implementeerd?
Dat was ik inderdaad net aan het proberen, ongeveer, en dat werkt inderdaad.

Als ik FontSizes laat overerven van DependencyObject (en er een singleton van maak) dan kan ik DepedencyProperties gebruiken. In XAML maak ik er dan dit van:
code:
1
<TextBlock Text="Test" FontSize="{Binding Source={x:Static Classes:FontSizes.Instance}, Path=Normal}" />


Ik vind dit wel een iets 'moeilijkere' constructie dan wat ik eerst had, maar als er geen betere alternatieven zijn dan neem ik hier maar genoegen mee :+

Ik zal de DynamicResource aanpak nog proberen, hoewel ik dan ook weer steeds een resource aan moet maken (of moet mergen) en dan word het alleen nog maar langer ben ik bang.

Mijn iRacing profiel


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Ik heb een voorbeeld gevonden waar een Background color gezet wordt maar volgens mij voor jou ook van toepassing:
XML:
1
<TextBlock Background="{Binding Source={x:Static Member=colors:MyColorTable.Hex1}}" />

Nu met Land Rover Series 3 en Defender 90

Pagina: 1