3

私は、WPF アプリケーションでさまざまな高さの行を持つ 1 列のグリッドを持っています。グリッド内の項目は動的に生成され、実行時に追加および削除されます。

追加される行ごとに、各要素の間に GridSplitter 行を挿入したいと思います。

私は現在、ItemControl を介してモデル データをバインドし、AttachedProperties を使用して要素の行数を取得します (明らかに、最終的な解決策には、GridSplitter を含める行数が多くなります)。

<ItemsControl ItemsSource="{Binding MyModel}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid local:GridHelpers.RowCount="{Binding MyModel.RowCount}" local:GridHelpers.ColumnCount="1"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

MyModel 変数は、ViewModel オブジェクトを含む ObservableCollection です。RowCount は、コレクション内の要素の数を返すメンバー変数です。

各行の間に GridSplitter を挿入するにはどうすればよいですか?

各要素と GridSplitter をテンプレートから生成したいと考えています。ただし、GridSplitter がテンプレート内に含まれている場合、Grid ではなく ContentPresenter が親として存在するため、機能しません。ゼロから書かれた独自のスプリッター コンポーネントを持つ独自の UI 要素を作成する以外に、アイデアが不足しています。きっと他に道があるはず!

助けてくれて本当にありがとうございます。

4

2 に答える 2

1

プロパティを定義するGridHelpers静的クラスは、.RowCountRowDefinitionItemsSource

2 番目のアイテムとそれ以降のすべてのアイテムについては、コードを追加する代わりにRowDefinition、アイテム用とスプリッター用の 2 つの行定義を追加する必要があります。次に、コードは、動的に追加する 2 つの RowDefinitions の最初の Grid.Row 値を持つ gridsplitter も追加する必要があります。それはいつも奇妙だろう。

    var gs = new GridSplitter();
    gs.SetValue(Grid.RowProperty, x); //x = the RowDefinition you are generating
    gs.ResizeBehavior = GridResizeBehavior.PreviousAndNext;
    gs.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
    gs.VerticalAlignment = System.Windows.VerticalAlignment.Top;
    gs.Height = 3; //or whatever other height you desire.

次に、アイテム自体に別の RowDefinition を追加します。項目の Grid.Row プロパティを偶数行定義に設定することを忘れないでください

于 2012-10-22T00:39:17.250 に答える
0

さて、かなりの量を読んだ後、同じことをしたい人のために、最善の解決策を見つけたと思います.

コア WPF ライブラリでの ColumnResizerAdorner の動作に似たものを実装しました。MSDN の WPF サンプルの ResizingAdorner の例も参照する価値があります。

Thumb を VisualCollection に追加する装飾用のクラスがあります。サム ドラッグ イベントを処理するためのクラス。このクラスは Grid 行の定義を認識し、それに応じてサイズを変更します。

于 2012-11-10T15:21:55.600 に答える