0

私は現在、Grid を ItemsPanel として使用する ItemsControl の ControlTemplate を構築しようとしています。ここで、各項目は水平に積み重ねられ、GridSplitter で区切られています。

基本的な目標は、すべての項目が一列に積み上げられ、スプリッターで各項目のサイズを変更できる、動的にバインド可能な ItemsControl を持つことです。

頭を悩ませることができないことが 2 つあります。GridSplitter はどのようにして各アイテム間で自動的に終了するはずですか? 各項目に Grid.Column を設定するにはどうすればよいですか。

これが単純なコントロール テンプレートで実行できない場合、このようなものを実装するための一般的で適切な方法は何でしょうか? このために新しい ItemsControl を作成する必要がありますか?

実際の (Grid)Splitter コントロールが必要なので、カスタム ControlTemplates を使用できます。また、セルの追加のレイアウト機能 (GridLengthUnitType、Stretch、Alignment) があると非常に便利だと思います。

したがって、自分で作成するときは、カスタム ItemsControl (各項目のスプリッターを生成する) とカスタム パネル (1 行/1 列グリッドのように動作するため、Grid.Row、Grid.Column プロパティを添付する必要はありません) が必要になると思います。 、.Orientation で十分です) スプリッター コントロールを受け取ることができ、レイアウトに関してそれらを処理する方法を知っています。

このアプローチについてどう思いますか?好ましい方法ですか、それとも良い方法ですか?

4

2 に答える 2

2

私の理解では、ItemsControl は、アイテムごとに 1 つのコントロールのみを作成し、itemshost に追加するという考えに基づいているということです。アイテムごとに GridSplitter とデフォルトの itemcontainer の両方を作成することは、この原則に反します。

列が 1 つしかなく、縦方向にのみサイズを変更したいので、独自のパネルを作成することをお勧めします。これは StackPanel のように動作しますが、常に子要素間に数ピクセルのギャップが残ります。マウスがこのギャップの上にあり、ユーザーがドラッグを開始すると、パネルは最も近い子要素のサイズを変更できます。

そのため、サイズ変更ロジックをカスタム パネルに実装する必要があります。これが最大の欠点と考えられますが、IMO は 1 か所だけに隠されているため、それだけの価値があります。この Panel を itemshost として使用する以外に、ItemsControl/ItemTemplate/ItemContainerStyle で特別なことをする必要はありません。

標準の StackPanel を使用して、サイズ変更ロジックを実装するマウス ハンドラーを追加することもできます。ただし、ギャップを作成するには、ItemContainerStyle にマージンを設定する必要があります。

于 2010-03-24T15:29:59.827 に答える
0

グリッドスプリッターを独自の列に配置する必要があります。グリッドに行が 1 つしかないと仮定すると、任意のアイテムに Grid.Row を設定する必要はありません。ただし、必要に応じて、0 (最初の行) に設定できます。

ただし、これは、独自のカスタム コンテナーを作成する十分な理由になる場合があります。おそらく、グリッドではなくスタックパネルに基づいています。グリッドスプリッターは、それ自体の両側のアイテムのサイズに影響を与えると思います(サイズ変更されているものを除くすべてをシフトすることが必要だと思います)。

于 2010-03-19T03:55:40.900 に答える