Autor Beitrag
uga_uga_ug_ug
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 12.03.16 20:15 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 berechnen lassen, s. z.B. Advanced Text Formatting in WPF. Mittels FormattedText.Width erhältst du dann die ausgerechnete Breite.
Hier noch ein Beispiel:
ausblenden 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);
}

Für diesen Beitrag haben gedankt: uga_uga_ug_ug
uga_uga_ug_ug Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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).