2012-04-06 16 views
2

私のプログラムでは、私はビューボックス内にWrapPanelを持っています。 WrapPanel(実際にはItemsControlのItemsPanelTemplate)には、すべて異なるサイズのバインドされたアイテムが含まれています。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> 

このすべての目標は、すべてのアイテムが1つの画面に収まるようにすることです。 Viewboxは内容がすべて収まるようにズームすることでこれを処理します。 WrapPanelの各項目は、ユーザが定義したテキストなので、すべて異なるサイズにすることができます。私がWrapPanelで達成しようとしているのは、画面上のテキストができるだけ大きくなることです。私はWrapPanel MaxHeightを設定して、これを行っています。これは、背が高すぎる場合、項目がより多くの列にラップされるようにしていますが、これを行うにはちょっとした方法であり、Itemsの異なるグループについては、MaxHeightが異なる。

私がこれを意味する例として、ItemsControlがバインドされているアイテムがアルファベットのすべての文字を表示しているとします。アイテムを複数の列に折り返すように強制することなく、実際に小さなテキストで1つの本当に背の高い列に終わるでしょうが、WrapPanelのMaxHeightを設定すると、アイテムをこのように複数の列に強制することができます。画面上で大きくなる:

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よりも優れたコントロールがありますか?私が望むものを得るためにカスタムパネルを作成する必要がありますか?あなたは

編集提供できる任意の助け

ありがとう:UniformGridが動作しない理由の例えば

は、(異なるアイテムを表す各文字で)私は、これらの5つの項目を持っていたと仮定します

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

UniformGridを使用すると、すべてのアイテムがアイテムEのサイズになり、画面上でさらに多くのスペースを占めることになります。

+0

ItemsPanelとしてUniformGridを使用することはどうですか?あなたがアイテムを追加すると、行と列が追加されます。 –

+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 

、それがいることをあなたに本当に重要だ場合それらは列ではなく列で配置されます。それから少し難しいです。ここで彼らは、列で配置され得るために本当にハック方法です:

<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でこれをやって、Panel内のすべての項目の高さと幅を取得するだけでよいのだろうかと思っています。 – aalex675