1

データベースからのレコードを表示するリストボックスがあります。一列に次々とやってくる。プログラムでレコードを 3 行 3 列、つまり 3 つのレコードを 1 行に配置し、その後 3 つのレコードを 1 行に配置する方法。親切に提案しますか?

ありがとう。

4

1 に答える 1

1

レコードが固定幅である (または可能である) 場合、簡単です: ListBox.ItemsPanel を WrapPanel に変更し、ListBox の幅をアイテムの幅の 3 倍強に設定するだけです。

<DataTemplate DataType="{x:Type my:CustomItem}">
  <Border Width="100" ...>
    ...
  </Border>
</DataTemplate>

...

<ListBox ... Width="320">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel/>
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  ...
</ListBox>

使用可能な幅を 3 で割る必要があり、すべてのアイテムがまったく同じ高さであることがわかっている場合 (または、すべての行が任意のアイテムの最大高さであっても問題ない場合)、UniformGrid を使用した非常に簡単な解決策があります。高さが指定されていない場合:

<ListBox ... >
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <UniformGrid Width="3" />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  ...
</ListBox>

使用可能な幅を 3 で割ってアイテムの幅を取得するが、アイテムをできるだけ垂直方向に積み重ねる場合、それは可能ですが、純粋な XAML では注意が必要です。(純粋な XAML で行うことはお勧めしませんが、そのようにしたい場合は、星型サイズの 3 つの列と固定幅の列を持つ非表示の Grid を作成し、最初の ActualWidth へのバインドを使用できます。非表示のグリッドの列)。

簡単な方法は、水平方向は UniformGrid のように機能し、垂直方向は StackPanel のように機能する単純なカスタム パネルを作成することです。これは非常に単純な Panel サブクラスです。

  • MeasureOverride は、必要な幅を任意の子の最大幅の 3 倍として計算します
  • MeasureOverride は、必要な高さを sum(max(3 の各グループの高さ)) として計算します。
  • ArrangeOverride は、行ごとに 3 つの子をレイアウトし、それぞれの DesiredWidth/3 を前の行の右側に配置し、次の行は現在の行から max(height) 下に配置します。

明らかに、カスタム パネルを設計する場合、「3」をハードコーディングしないでください。それをプロパティ (おそらく DependencyProperty) にすることで、簡単に変更でき、必要に応じてパネルを別の場所で再利用できます。

于 2010-07-16T06:38:35.963 に答える