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:
De FontSizes class heeft gewoon 3 static read-only properties die de waarde uit de settings teruggeven:
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!
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!