2016-12-25 6 views
-2

In den letzten paar Tagen habe ich versucht habe um das folgende Layout Textblocks, meinen Kopf zu wickeln:WPF - Komplexe TextBlock- Layout

-------------------- ----------- 
|   1  | |   | 
-------------------- | 3 | 
|  2  | |   | 
----------------- ----------- 

Alle der Textblocks haben dynamische Breite. Sie haben eine feste Höhe und sind in einem festen Behälter. Sie müssen die folgenden Anforderungen erfüllen:

  • 2 hat maximale Priorität - es muss immer in voller Länge sein.
  • 3 den verbleibenden Raum füllen links nach 2.

Sizing Wenn TextBlock- 1 ignoriert, diese beiden Anforderungen, indem sie die beiden anderen Textblocks in einem Grid erfüllt werden konnten, mit Spalten auf „auto“ und " *" beziehungsweise.

Es gibt eine dritte Anforderung aber:

  • 1 übernimmt alle Raum kann es, aber ohne Einschränkung 3.

Beispiele:

Lang Inhalt in Block 3 (Block 2 Inhalt ist voller Länge, Block 3 Inhalt wird getrimmt):

Kurzer Inhalt in Block 3 (beide Blöcke 2 und 3 sind voller Länge; Block 1 füllt den verbleibenden Platz aus):

--------------------- --------- 
|   1   | |  | 
--------------------- | 3 | 
|  2  |  |  | 
-----------------  --------- 

Gibt es eine Möglichkeit, dieses Layout in WPF zu erreichen? Wie?

Antwort

0

Ich glaube nicht, dass dies mit reinem XAML möglich ist. Eine Möglichkeit, Ihre Anforderungen zu erfüllen, ist die Implementierung Ihres eigenen Panels, das all die Magie nutzt. Hier ist eine Implementierung:

public class SpecialPanel : Panel 
{ 
    protected override Size MeasureOverride (Size constraint) 
    { 
     foreach (UIElement child in Children) 
     { 
      child.Measure (constraint); 
     } 

     return constraint; 
    } 

    protected override Size ArrangeOverride (Size arrangeSize) 
    { 
     if (VisualChildrenCount != 3) 
     { 
      return (arrangeSize); 
     } 

     Size sizeLabel0 = InternalChildren[0].DesiredSize; 
     Size sizeLabel1 = InternalChildren[1].DesiredSize; 
     Size sizeLabel2 = InternalChildren[2].DesiredSize; 

     InternalChildren[1].Arrange (new Rect (0, sizeLabel0.Height, sizeLabel1.Width, sizeLabel1.Height)); 
     var maxRemainingWidthFor2 = arrangeSize.Width - sizeLabel1.Width; 

     if (maxRemainingWidthFor2 <= 0) 
     { 
      InternalChildren[0].Arrange (new Rect (0, 0, sizeLabel0.Width, sizeLabel0.Height)); 
     } 
     else 
     { 
      if (maxRemainingWidthFor2 < sizeLabel2.Width) 
      { 
       InternalChildren[2].Arrange (new Rect (arrangeSize.Width - maxRemainingWidthFor2, 0, maxRemainingWidthFor2, sizeLabel2.Height)); 
       InternalChildren[0].Arrange (new Rect (0, 0, Math.Min (sizeLabel0.Width, sizeLabel1.Width), sizeLabel0.Height)); 
      } 
      else 
      { 
       var max0 = arrangeSize.Width - maxRemainingWidthFor2; 
       var width0 = Math.Min (sizeLabel0.Width, max0); 

       InternalChildren[2].Arrange (new Rect (arrangeSize.Width - sizeLabel2.Width, 0, sizeLabel2.Width, sizeLabel2.Height)); 
       InternalChildren[0].Arrange (new Rect (0, 0, arrangeSize.Width - sizeLabel2.Width, sizeLabel0.Height));. 
      } 
     } 

     return arrangeSize; 
    } 
} 

Verbrauch:

<local:SpecialPanel> 
     <Label 
      x:Name="Label1" 
      VerticalContentAlignment="Center" 
      Content="TextBlock00000000000000" /> 
     <Label 
      x:Name="Label2" 
      VerticalContentAlignment="Center" 
      Content="TextBloc111111111111" /> 
     <Label 
      x:Name="Label3" 
      HorizontalContentAlignment="Center" 
      VerticalContentAlignment="Center" 
      Content="Label333333" /> 
    </local:SpecialPanel> 
+0

Danke für die Antwort. Es funktioniert jedoch nicht wie erwartet für das zweite Beispiel. Ich habe Ihren Code geändert, damit er funktioniert, der letzte 'else'-Zweig muss folgendermaßen geändert werden: 'InternalChildren [2] .Arrange (neues Rect (arraySize.Width - sizeLabel2.Width, 0, sizeLabel2.Width, sizeLabel2. Höhe)); InternalChildren [0] .Arrange (neues Rect (0, 0, arraySize.Width - sizeLabel2.Width, sizeLabel0.Height)); '. Wenn Sie Ihre Antwort ändern, werde ich sie akzeptieren. – Mastah

+0

Ich bin froh, dass Sie die Idee haben und die Logik an Ihre Bedürfnisse anpassen können. Ich habe meine Antwort aktualisiert. – gomi42