2012-04-06 6 views
2

In meinem Programm habe ich ein WrapPanel innerhalb einer Viewbox. Das WrapPanel (das eigentlich die ItemsPanelTemplate eines ItemsControl ist) enthält einige gebundene Elemente, die alle unterschiedliche Größen haben können.WPF-WrapPanel In einer ViewBox maximale Größe

<Viewbox Name="ViewWindow" Margin="10"> 
    <Grid> 
    <ItemsControl ItemsSource="{Binding Path=Items}"> 
     <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel Orientation="Vertical" MaxHeight="600"/> 
     </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 

Ziel all dessen ist, dass ich für alle Elemente möchten auf einem einzigen Bildschirm passen dimensionieren. Die Viewbox bewältigt dies, indem sie den Inhalt so vergrößert, dass sie alle passen. Jedes Element im WrapPanel ist ein benutzerdefinierter Text und kann daher alle unterschiedlich groß sein. Was ich mit dem WrapPanel erreichen möchte, ist, dass der resultierende Text auf dem Bildschirm so groß wie möglich ist. Ich habe das getan, indem ich das WrapPanel MaxHeight so eingestellt habe, dass die Elemente in mehr Spalten eingeschlossen werden, wenn sie zu groß sind, aber das ist eine Art Hacky-Methode, und ich finde für verschiedene Gruppen von Elementen die MaxHeight anders.

Als Beispiel für das, was ich damit meine, stellen Sie sich vor, dass die Items, an die ItemsControl gebunden ist, einfach jeden Buchstaben im Alphabet anzeigt. Ohne irgendeine Möglichkeit, die Elemente auf mehrere Spalten umbrechen zu lassen, würden Sie eine wirklich große Spalte mit wirklich kleinem Text erhalten, aber wenn wir die MaxHeight des WrapPanels setzen, können wir die Elemente auf mehrere Spalten wie diese und den Text setzen auf dem Bildschirm größer sein:

A F K P U Z 
B G L Q V 
C H M R W 
D I N S X 
E J O T Y 

Gehe ich das alles falsch? Gibt es eine bessere Kontrolle als WrapPanel? Muss ich eine Art benutzerdefiniertes Panel erstellen, um zu bekommen, was ich will?

Vielen Dank für jede Hilfe, die Sie

bearbeiten bieten:

Ein Beispiel dafür, warum ein Uniform nicht funktionieren würde, nehme ich diese 5 Elemente hatte (mit jedem Buchstaben ein anderes Element darstellt)

A C E 
A C E 
A D E 
B D E 

Mit einem Uniform alle Einzelteile würden die Größe des Elements E nehmen und es würde viel mehr Platz auf dem Bildschirm alle in Anspruch nehmen.

+0

Wie wäre es mit einem UniformGrid als ItemsPanel? Ich denke * fügt Zeilen und Spalten hinzu, wenn Sie Elemente hinzufügen. –

+0

Sie können dies nicht auf eine einfache Weise tun. Wenn sich ein Wrap-Panel in einer Viewbox befindet, muss es nie umbrochen werden, da die Viewbox es verkleinert. – Phil

Antwort

2

Ist dies zu erreichen, was Sie zu tun versuchen:

 <ItemsControl ItemsSource="{Binding Path=Items}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <UniformGrid IsItemsHost="True"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 

Ihr Beispiel Alphabet verwenden, ich legte es so aus:

A B C D E F 
G H I J K L 
M N O P Q R 
S T U V W X 
Y Z 

Nun, wenn es dir wirklich wichtig ist, dass Sie sind eher in Spalten als in Reihen angeordnet, dann ist es ein wenig schwierig. Hier ist eine wirklich hacky Weg, um sie durch Spalten angeordnet sind zu erhalten:

<ItemsControl ItemsSource="{Binding Path=Items}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <UniformGrid IsItemsHost="True"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding}"> 
         <TextBlock.LayoutTransform> 
          <TransformGroup> 
           <ScaleTransform ScaleX="-1"/> 
           <RotateTransform Angle="-90"/> 
          </TransformGroup> 
         </TextBlock.LayoutTransform> 
        </TextBlock> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
      <ItemsControl.LayoutTransform> 
       <TransformGroup> 
        <ScaleTransform ScaleX="-1"/> 
        <RotateTransform Angle="-90"/> 
       </TransformGroup> 
      </ItemsControl.LayoutTransform> 
     </ItemsControl> 

ich nicht denken Sie ein einheitliches Raster sagen kann, um die Dinge Spalte zuerst zu arrangieren.

+0

Nun, ich glaube nicht, dass ein UniformGrid tun wird, was ich brauche, weil die Gegenstände unterschiedliche Höhen haben werden und ich nicht möchte, dass sie alle so angeordnet werden, dass sie so viel Platz wie das größte Stück einnehmen . – aalex675

+0

@ aalex675: Also willst du Dinge so nah wie möglich packen, ohne Ordnung zu haben?Selbst WrapPanel wird Spalten haben, die die Breite des größten Elements in der Spalte haben. –

+1

Ich bin nicht besorgt über die Breite der Spalten ist gleich, das ist in Ordnung. Ich vermute, dass ich für das WrapPanel die beste MaxHeight basierend auf den Höhen und Breiten der Items herausfinden muss. Ich fange an, mich zu fragen, ob ich das vielleicht in einem ValueConverter tun könnte und nur die Höhen und Breiten aller Elemente im Panel zu berechnen, um es herauszufinden. – aalex675