none
VB.NET + WPF - Ändern der Eigenschaften von Steuerelementen im Ereigniss WindowLoaded RRS feed

  • Frage

  • Hallo,

    ich als WPF Umsteiger (mit VB.NET) hab mal wieder ein Problem. Das Fenster des Programms hat die Eigenschaften WindowState = Maximized und WindowStyle = None. Da ich nicht weiß wie groß die Bildschirmauflösung des Benutzers ist, soll das Programm die Steuerelemente selbst positionieren. Dieser Code soll das Label LabelTitle zentriert am oberen Bildschirmrand positionieren:

    'x=X-Koordinate

    Dim x As Integer = Me.Width / 2 - LabelTitle.Width / 2 LabelTitle.Margin = New Thickness(x, 12, 0, 0)

    Leider erscheint dann eine Fehlermeldung ("Teilen Sie nicht durch 0"), die es in den normalen WinForms Anwendungen nicht gab.

    Kann mir jemand helfen, dieses Problem zu beseitigen?

    Danke im Voraus.

    Gruß, Bolzen


    • Bearbeitet Bolzen Mittwoch, 5. Dezember 2012 16:08 verbesserte verständlichkeit
    • Verschoben Robert BreitenhoferModerator Mittwoch, 12. Dezember 2012 11:43 WPF (aus:Visual Basic (ab Version 2002 / .NET))
    Mittwoch, 5. Dezember 2012 16:06

Antworten

  • Hallo,

    In WPF Haben die Eigenschaft Height- und Width nur Theoretische Werte. Diese Können Beispielsweiße auch double.NaN sein, wenn im XAML Auto steht. Berechnen müsstest du es mit ActualHeight bzw. ActualWidth.

    In deinem Fall gibt es aber eine einfachere Lösung: Setze HorizontalAlignment auf Center und mache das links- und das rechtsseitigen Margin 0. Dann ist dein Label zentriert. Das ist schließlich der Vorteil von WPF ;)

    Siehe auch:
    http://msdn.microsoft.com/de-de/library/ms751709.aspx

    Der Fehler kommt bestimmt weil die Breite deines Labels auf Auto steht. Also NaN ist.


    Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/

    • Als Antwort markiert Bolzen Mittwoch, 5. Dezember 2012 16:26
    Mittwoch, 5. Dezember 2012 16:22
    Moderator

Alle Antworten

  • Hallo,

    In WPF Haben die Eigenschaft Height- und Width nur Theoretische Werte. Diese Können Beispielsweiße auch double.NaN sein, wenn im XAML Auto steht. Berechnen müsstest du es mit ActualHeight bzw. ActualWidth.

    In deinem Fall gibt es aber eine einfachere Lösung: Setze HorizontalAlignment auf Center und mache das links- und das rechtsseitigen Margin 0. Dann ist dein Label zentriert. Das ist schließlich der Vorteil von WPF ;)

    Siehe auch:
    http://msdn.microsoft.com/de-de/library/ms751709.aspx

    Der Fehler kommt bestimmt weil die Breite deines Labels auf Auto steht. Also NaN ist.


    Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/

    • Als Antwort markiert Bolzen Mittwoch, 5. Dezember 2012 16:26
    Mittwoch, 5. Dezember 2012 16:22
    Moderator
  • Hi Bolzen,

    geh doch bitte mal schrittweise mit den Debugger durch den Code und schau welche Zeile den Fehler schmeißt. 

    Für mich scheint in dem gegeben Code auf den ersten blick kein Grund für den Fehler dazu sein.

    MFG

    Björn


    • Bearbeitet Palin Mittwoch, 12. Dezember 2012 23:55
    Mittwoch, 5. Dezember 2012 16:27
  • Hallo Koopakiller,

    danke für die schnelle, präzise Antwort.

    Gruß, Bolzen

    Mittwoch, 5. Dezember 2012 16:27
  • Hallo Palin,

    sofern die Werte für Width und/oder Height nicht vorher , im Xaml oder Code, schon explizit festgelegt wurden, kann der Code von Bolzen nicht funktionieren. Denn koopakiller hat da vollkommen Recht, wenn Width und/oder Height nicht vorher explizit festgelegt wurden, dass diese Werte dann auf double.NaN stehen.... und NaN lässt sich nun mal nicht dividieren, das war unter WinForms allerdings auch so ;-).

    Allerdings sind Width und/oder Height keine theoretischen Werte, es ist einfach eine Frage des Zeitpunktes im Layoutprozess von WPF wann diese Werte zur Verfügung stehen... das würde jetzt aber hier zu weit führen um das zu erklären... Stichworte im Rahmen des Layoutprozesses der von Wpf ausgeführt wird, wären da: Measure, MeasureOverride, Arrange, ArrangeOverride, OnRender... DesiredSize, ActualSize, finalSize und RenderSize.

    Übrigens könnte Bolzen seine Werte tatsächlich in der Methode ArrangeOverride anpassen, allerdings ist die von koopakiller vorgeschlagene Lösung "HorizontalAlignment=Center" die praktikablere und sicherlich auch die meist genutzte Variante ;-).

    Viele Grüße Carl

    Mittwoch, 12. Dezember 2012 20:51