2

私のプログラムでは、ビューボックス内にWrapPanelがあります。WrapPanel(実際にはItemsControlのItemsPanelTemplate)には、すべて異なるサイズのバインドされたアイテムが含まれています。

<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つの画面に収まるサイズにすることです。ビューボックスは、すべてが収まるようにコンテンツをズームすることでこれを処理します。WrapPanelの各アイテムはユーザー定義のテキストであるため、すべて異なるサイズにすることができます。私がWrapPanelで達成しようとしているのは、画面に表示されるテキストが可能な限り大きくなることです。アイテムが高すぎる場合にアイテムがより多くの列にラップされるようにWrapPanelMaxHeightを設定することでこれを行ってきましたが、これは一種のハックな方法であり、アイテムのさまざまなグループに対して、MaxHeightは違う。

これが意味する例として、ItemsControlがバインドされているItemsは、単にすべての文字をアルファベットで表示していると想像してください。アイテムを複数の列に強制的に折り返す方法がないと、テキストが非常に小さい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よりも優れたコントロールを使用できますか?欲しいものを手に入れるために、ある種のカスタムパネルを作成する必要がありますか?

あなたが提供できるどんな助けにも感謝します

編集:

ユニフォームグリッドが機能しない理由の例として、これらの5つのアイテムがあるとします(各文字は異なるアイテムを表します)

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

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

4

1 に答える 1

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>

均一なグリッドに最初に列を配置するように指示できるとは思いません。

于 2012-04-06T18:28:07.587 に答える