2012-04-06 4 views
2

В моей программе у меня есть WrapPanel внутри окна просмотра. WrapPanel (который фактически является элементом ItemsPanelTemplate элемента ItemsControl) содержит некоторые связанные элементы, которые могут быть разных размеров.WPF WrapPanel В максимальном размере ViewBox

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

Целью всего этого является то, что я хотел бы, чтобы все элементы должны быть размера, чтобы поместиться на одном экране. Viewbox обрабатывает это путем изменения содержимого, чтобы все они соответствовали. Каждый из элементов в WrapPanel - это текст, определенный пользователем, и поэтому все они могут быть разных размеров. То, что я пытаюсь выполнить с помощью WrapPanel, заключается в том, что итоговый текст на экране будет как можно большим. Я делаю это, установив WrapPanel MaxHeight, чтобы элементы были обернуты в большее количество столбцов, если они слишком высоки, но это своего рода хакерский способ сделать это, и я нахожу для разных групп элементов, MaxHeight должен быть другой.

В качестве примера того, что я имею в виду под этим, представьте, что элементы, с которыми связан элемент ItemsControl, - это просто отображение каждой буквы в алфавите. Без какого-либо способа заставить элементы обернуть несколько столбцов, вы получите один действительно высокий столбец с действительно маленьким текстом, но если мы установим MaxHeight из WrapPanel, мы можем заставить элементы к нескольким столбцам, как это, и текст будет больше на экране:

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 

Я все об этом не так? Есть ли лучший контроль над использованием WrapPanel? Нужно ли мне создавать какую-то пользовательскую панель, чтобы получить то, что я хочу?

Спасибо за любую помощь вы можете предложить

Edit:

Для примера того, почему UniformGrid не будет работать, предположит, что я имел эти 5 пунктов (с каждой буквой, представляющей другой элемент)

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

с помощью UniformGrid всех элементов будет принимать размер элемента E и все это будет занимать намного больше места на экране.

+0

Как насчет использования UniformGrid в качестве элемента ItemsPanel? Я * думаю *, который добавит строки и столбцы при добавлении элементов. –

+0

Вы не сможете это сделать, это простой способ. Если панель просмотра находится внутри окна просмотра, ее никогда не придется переносить, потому что окно просмотра сжимает ее, чтобы она соответствовала. – Phil

ответ

2

ли добиться этого, что вы пытаетесь сделать:

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

Используя свой пример алфавит, я это выложил так:

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 

Теперь, если это действительно важно для вас, они располагаются в столбцах, а не в строках, тогда это немного сложно. Вот действительно Hacky способ получить их располагаются по столбцам:

<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> 

Я не думаю, что вы можете сказать равномерную сетку, чтобы организовать вещи столбец первой.

+0

Ну, я не думаю, что UniformGrid будет делать то, что мне нужно, потому что элементы будут разных высот, и я не хочу, чтобы все они были выложены таким образом, что все они занимают столько места, сколько самый большой предмет , – aalex675

+0

@ aalex675: Итак, вы хотите упаковать вещи как можно ближе, без видимости порядка?Даже у вас WrapPanel будут столбцы, занимающие ширину самого большого элемента в столбце. –

+1

Меня не интересует ширина равных столбцов, это нормально. Я предполагаю, что мне нужно, чтобы WrapPanel определил лучший MaxHeight на основе высот и ширины элементов в нем. Я начинаю задаваться вопросом, могу ли я просто сделать это в ValueConverter и просто получить высоты и ширину всех элементов в панели, чтобы понять это. – aalex675

Смежные вопросы