Announcement

Collapse
No announcement yet.

WPF Ermittlung Breite von Controls

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WPF Ermittlung Breite von Controls

    Hallo Entwicklergemeinde:


    Ich benutze Tabcontrol, dieses Tabcontrol enthält mehrere Tabitems.

    In jedem Tabitem werden dynamisch mehrere Controls erzeugt. Beispiel:

    <stackpanel>
    label1 Textbox
    </stackpanel>
    <stackpanel>
    label2 Textbox
    </stackpanel>

    Nun möchte ich die Textboxen ausgerichtet haben, damit diese in einer Flucht sind.

    Das mache ich mit folgendem Code (wird in Main_Loaded ausgeführt)

    [highlight=vbnet]
    For x As Integer = 1 To Anzahl_tab_items
    Select Case x
    Case 1
    stack_top = StackPanel_top1
    Case 2
    stack_top = StackPanel_top2
    Case 3
    stack_top = StackPanel_top3
    Case 4
    stack_top = StackPanel_top4
    Case 5
    stack_top = StackPanel_top5
    End Select
    Dim lb_max_width As Integer = 0
    'Ermittlung der max Breite der Labels, damit eine Anpassung mit Tabelleneffekt erfolgen kann
    'Ermittlung aller Stackpanels in stackpanel_top
    For Each uie As UIElement In stack_top.Children
    If TypeOf uie Is StackPanel Then
    'Ermittlung aller Labels in dem ermittelten Stackpanel
    For Each uie2 As UIElement In CType(uie, StackPanel).Children
    If TypeOf uie2 Is Label Then
    If lb_max_width < CType(uie2, Label).RenderSize.Width Then
    lb_max_width = CType(uie2, Label).RenderSize.Width
    End If
    End If
    Next
    End If
    Next
    'Setzen der min Breite der Labels, damit eine Anpassung mit Tabelleneffekt erfolgen kann
    'Ermittlung aller Stackpanels in stackpanel_top
    For Each uie As UIElement In stack_top.Children
    If TypeOf uie Is StackPanel Then
    'Ermittlung aller Labels in dem ermittelten Stackpanel
    For Each uie2 As UIElement In CType(uie, StackPanel).Children
    If TypeOf uie2 Is Label Then
    Dim puffer As Label
    puffer = uie2
    puffer.Width = lb_max_width + 5
    puffer.MinWidth = lb_max_width + 5
    End If
    Next
    End If
    Next
    Next

    System.Windows.Forms.Application.DoEvents()
    [/highlight]


    Das funktioniert für das erste Tabitem, jedoch nicht für alle weiteren Tabitems.

    Dort werden alle Elemente mit der Breite = 0 ermittelt.


    Hat jemand von euch da bereits Erfahrungen gesammelt?

    Vielen Dank im voraus.

    derOptimist

  • #2
    Hallo,

    guck mal: Grid Panel - How to share the width of a column over multiple grids Damit kannst du dir den VB-Code sparen.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Danke für die schnelle Antwort.

      Ich schaue mir das mal an, jedoch könnte das schwierig werden, da die Grids auch dynamisch erstellt werden müssen. Das ist mit Stackpanels natürlich etwas einfacher.

      Beispiel:

      Immer ein "Datenpaar" pro Zeile
      <stackpanel>
      label1 Textbox1
      </stackpanel>
      <stackpanel>
      label2 Textbox2
      </stackpanel>
      <stackpanel>
      label3 Textbox3
      </stackpanel>
      <stackpanel>
      label4 Textbox4
      </stackpanel>

      Oder immer 2 Datenpaare pro Zeile
      <stackpanel>label1 Textbox1</stackpanel><stackpanel>label2 Textbox2</stackpanel>
      <stackpanel>label3 Textbox3</stackpanel><stackpanel>label4 Textbox4</stackpanel>


      Ziemlich komplex


      Vielleicht noch mal zu meiner Grundfrage:
      Gibt es eine Möglichkeit die Breite der Elemente bei der Initialisierung zu ermitteln?

      Schöne Grüße
      derOptimist

      Comment


      • #4
        Hallo,

        schau dir die Eigenschaften Width, ActualWidth (ggf. mit dem Debugger und dem TreeVisualizer) an.

        da die Grids auch dynamisch erstellt werden müssen
        ListBox oder allgemeiner ein ItemsControl verwenden - als Alternative.


        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hey Gü,

          danke für deine Hilfe! Das hat mir auf jeden Fall geholfen Layoutkomponenten unter WPF besser zu versehen (bin auch neu im WPF-Geschäft).

          Ich habe jetzt eine Lösung gefunden, die Breite während der Initialisierung zu ermitteln.

          Folgender Code muss unterhalb von Zeile 18:

          uie2.Measure(New Size(Double.PositiveInfinity, Double.PositiveInfinity))
          uie2.Arrange(New Rect(uie2.DesiredSize))

          Gruß
          derOptimist

          Comment

          Working...
          X