Horizontal/VerticalContentAlignment funktioniert nicht wie gedacht

  • WPF MVVM
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von DTF.

    Horizontal/VerticalContentAlignment funktioniert nicht wie gedacht

    Hallo :)

    Ich möchte dass mein Programm mit verschiedenen Skalierungen arbeiten kann und verwende daher hauptsächlich Grids mit prozentualen Höhen/Breiten.

    Wenn ich jetzt jedoch die Skalierung in den Windowseinstellungen nach oben korrigiere, z.B. von 100% auf 150%, werden Texte teilweise abegechnitten, z.B. in Labels und Textboxen.

    Jetzt kann man die natürlich einzeln in Viewboxen reinsetzen, das würde gehen. Was aber, wenn ich das zentral machen möchte, d.h. zum Beispiel über einen Style.

    Da gibts ja die Property HorizontalContenatAignment bzw. VerticalContentAlignment, die ich auf Stretch setzen kann, bloss der Text wird dadurch nicht an die Grösse des Labels oder der Textbox angepasst, was er ja eigentlich tun sollte. Oder nicht?

    Hab ich da irgendwas falsch verstanden? Oder gibts vielleicht noch andere Rangehensweisen an mein Problem?

    DTF schrieb:

    Wofür haben wir sonst die FontSize?


    Okay, ich hab jetzt nen Code gefunden der mir die FontSize an die Grösse der Textbox/des Labels anpasst per Konverter, denn ich hatte das gleiche Problem wie hier.

    Nur krieg ich den C# Code nicht richtig übersetzt, und ich verstehe ihn auch nicht. Kann mir da jemand unter die Arme greifen? Der Code sieht so aus:

    C#-Quellcode

    1. public class ProcentualHeightConverter : IValueConverter
    2. {
    3. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    4. {
    5. if (parameter is string p)
    6. {
    7. if (value is double v)
    8. {
    9. var result = double.TryParse(p, out double param);
    10. if (result)
    11. {
    12. return v / param;
    13. }
    14. }
    15. }
    16. return value;
    17. }
    18. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    19. {
    20. throw new NotImplementedException();
    21. }
    22. }


    Das Ergebnis vom Übersetzer so:

    VB.NET-Quellcode

    1. Public Class ProcentualHeightConverter
    2. Inherits IValueConverter 'hier muss ich stattdessen Implements nehmen, das ist klar
    3. Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As CultureInfo) As Object 'hier auch noch Implements
    4. Dim param As Double = Nothing, p As String = Nothing, v As Double = Nothing
    5. If CSharpImpl.__Assign(p, TryCast(parameter, String)) IsNot Nothing Then
    6. If CSharpImpl.__Assign(v, TryCast(value, Double)) IsNot Nothing Then
    7. Dim result = Double.TryParse(p, param)
    8. If result Then
    9. Return v / param
    10. End If
    11. End If
    12. End If
    13. Return value
    14. End Function
    15. Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As CultureInfo) As Object 'hier auch Implements zufügen
    16. Throw New NotImplementedException()
    17. End Function
    18. Private Class CSharpImpl 'was soll diese Klasse?
    19. <Obsolete("Please refactor calling code to use normal Visual Basic assignment")>
    20. Shared Function __Assign(Of T)(ByRef target As T, value As T) As T
    21. target = value
    22. Return value
    23. End Function
    24. End Class


    Ich bekomm in Zeile 7 den Fehler, dass Function __Assign veraltet ist.

    Und in Zeile 9:
    'IsNot' requires operands that have reference types, but this operand has the value type '<typename>'.
    Wie wär's denn mit dem simplen Ding? Hast du noch nie selbst einen Converter gemacht? Könntest auch noch den TargetType vergleichen, wie auch die CultureInfo nutzen.

    VB.NET-Quellcode

    1. Imports System.Globalization
    2. Public Class ProcentualHeightConverter
    3. Implements IValueConverter
    4. Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
    5. Dim valueAsDouble As Double
    6. Dim parameterAsDouble As Double
    7. If Double.TryParse(value.ToString(), valueAsDouble) AndAlso Double.TryParse(parameter.ToString(), parameterAsDouble) Then
    8. Return valueAsDouble / parameterAsDouble
    9. End If
    10. Return value
    11. End Function
    12. Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
    13. Throw New NotImplementedException()
    14. End Function
    15. End Class

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D