Entwickler-Ecke
WPF / Silverlight - Viewbox mit TextBlock -- Unterschied Win7 und Win10
uga_uga_ug_ug - Sa 12.03.16 20:15
Titel: Viewbox mit TextBlock -- Unterschied Win7 und Win10
Hallo miteinander,
beim Testen eines Programms ist mir eine kleine Unschönheit bezüglich der Viewbox in Kombination
mit einem TextBlock aufgefallen :?.
Das Ausgangszenario:
Im LayoutRoot(Grid)
liegt eine Viewbox (Horizontal-Alignment: Left, Vertical-Alignment: Center, Stretch: Uniform, StretchDirection: Both).
Die Viewbox beinhaltet ein TextBlock (Horizontal-Alignment: Left, Font: Segoe UI)
LayoutRoot
- Viewbox
-- TextBlock
In diesem Fall dient der TextBlock zur Anzeige der Uhrzeit (einschließlich Sekunden).
Beim Verändern der Fenstergröße verrichtet die Viewbox wie gewollt ihren Dienst -- Sie Passt die Größe des TextBlocks an.
Beim Aktualisieren der Uhrzeit (Setzen des Textes von TextBlock) während der Programmlaufzeit
unterscheidet sich die Darstellung betriebssystemabhängig:
- Windows 7:
Die Uhrzeit wird wie gewollt angezeigt. Der Text behält seine Größe bei.
- Windows 10 (an 2 unterschiedlichen PC's getestet):
Die Uhrzeit verändert ihre Größe.
Mein Erklärungsversuch:
In Windows 10 tut die Viewbox was sie soll. Auch dann wenn es nicht gewollt ist :/.
Da die Schriftart Segoe UI keine monospaced Font ist und die Zahl 1 weniger Platz einnimmt als z.B die 0 passt die Viewbox die Größe des Textes an (weil ja wieder Platz da ist um den Text größer zu manchen).
Dieses ständige Neuanpassen der Textgröße verursacht das scheinbare hin- und herwackeln des Textes.
Jetzt zu meinen Fragen:
Ist meine Annahme richtig so?
Wie ist es realisierbar, dass sich die Schriftgröße beim Window-Resize anpasst, nicht aber beim Setzen der Uhrzeit?
Viele Grüße und besten Dank! :)
Th69 - So 13.03.16 12:40
Hallo,
kannst du nicht einfach eine Mindestgröße für den TextBlock vorgeben, d.h.
MinWidth setzen?
Also so, daß es die maximale Breite (z.B. "00:00:00") benutzt - die Breite kannst du auch mittels
FormattedText [
https://msdn.microsoft.com/de-de/library/system.windows.media.formattedtext%28v=vs.110%29.aspx] berechnen lassen, s. z.B.
Advanced Text Formatting in WPF [
http://www.codeproject.com/Articles/426169/Advanced-Text-Formatting-in-WPF]. Mittels
FormattedText.Width erhältst du dann die ausgerechnete Breite.
Hier noch ein Beispiel:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Size MeasureText(TextBlock textBlock, string text) { var formattedText = new FormattedText( text, CultureInfo.CurrentUICulture, FlowDirection.LeftToRight, new Typeface(textBlock.FontFamily, textBlock.FontStyle, textBlock.FontWeight, textBlock.FontStretch), textBlock.FontSize, Brushes.Black);
return new Size(formattedText.Width, formattedText.Height); } |
uga_uga_ug_ug - So 13.03.16 19:55
Hallo Th69,
vielen Dank für die schnelle Info. Dass ich da nicht drauf gekommen bin... :autsch:
Ein kleiner Test hat gezeigt:
(gemessen wurde "00:00:00", "11:11:11", .... "99:99:99")
Bei Windows 7 ändert sich die durch die Methode gemessene Stringlänge nicht.
Bei Windows 10 haben einige Zahlen eine andere Länge ("44:44:44" ist am Längsten).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!