0

プログラムでWPFグリッドを操作しています。RowDefinitionを動的に追加するボタンがあり、グリッド列の1つに、グリッド内のRowDefinitionを削除するボタンが含まれています。

[削除]ボタンをクリックすると、次のように実行されます。

//Logic to remove all Cell contents first fort this Row
// ...
//Then Remove my RowDefinition
myGrid.RowDefinitions.Remove(MyRowDefinition);

これは問題なく機能します。私が抱えている問題は、残りのコントロールのGrid.RowAttachedPropertyが自動的に再調整されないことです。

これを達成する方法はありますか?

だから私が持っている場合:

<Label Name="lbl1" Grid.Row="0"/>
<Label Name="lbl2" Grid.Row="1"/>
<Label Name="lbl3" Grid.Row="2"/>

そして、最終的には次のようになると予想される2番目のRowDefinitionを削除します。

    <Label Name="lbl1" Grid.Row="0"/>
    <Label Name="lbl3" Grid.Row="1"/>

私が得ているものではありません:

    <Label Name="lbl1" Grid.Row="0"/>
    <Label Name="lbl3" Grid.Row="2"/>

しかし、そうではありません。これを自動的に行う方法がない場合は、自分でコーディングする必要があります。

お知らせ下さい..

私のアプリは次のようになります。 FormDesigner

4

2 に答える 2

2

それを自分で処理するには、コードを追加する必要があります。ただし、グリッドを使用せず、ListBoxItem テンプレートが 3 列と 1 行のグリッドである ListBox を使用します。1 つの列は赤いドラッグ領域、別の列は青いドラッグ領域、3 番目の列はボタンです。各 ListBox アイテムがグリッド行を表すため、必要な行は 1 つだけです。

最初に行う必要があるのは、上記のグリッドにデータを格納するコレクションが ObservableCollection であることを確認することです。次に、それを ListBox の ItemsSource にバインドします。あなたのデータがどのように見えるかわかりませんので、もしあれば、すべてのバインディングを適切に処理してください。

ボタンの PreviewMouseUp にハンドラーを追加します。PreviewMouseUp を使用すると、ListBox は、ボタンの PreviewMouseUp が処理される前に SelectedItem を変更できます。次に、対応するハンドラーで、ListBox にバインドされたコレクションから ListBox.SelectedItem を削除します。

変更されるコレクションは ItemsSource にバインドされた ObservableCollection であるため、ListBox はそのバインドを更新するように通知され、すべての削除を処理します。

于 2012-09-25T17:10:24.077 に答える
0

手動で解決した方法は次のとおりです。

            myGrid.RowDefinitions.Remove(MyRowDefinition);
            myGrid.ReadjustRows(RemovedRowIndex);

いくつかの拡張メソッドを作成しました。

    public static  List<UIElement> GetGridCellChildren(this Grid grid, int row, int col)
    {
        return grid.Children.Cast<UIElement>().Where(
                            x => Grid.GetRow(x) == row && Grid.GetColumn(x) == col).ToList();
    }

    public static void ReadjustRows(this Grid myGrid, int row)
    {
        if (row < myGrid.RowDefinitions.Count)
        {
            for (int i = row + 1; i <= myGrid.RowDefinitions.Count; i++)
            {
                for (int j = 0; j < myGrid.ColumnDefinitions.Count; j++)
                {
                    List<UIElement> children = myGrid.GetGridCellChildren(i, j);
                    foreach(UIElement uie in children)
                    {
                        Grid.SetRow(uie,i - 1);
                    }
                }
            }
        }
    }

誰かがそれを必要とする場合は、ここで、特定のグリッド セルのすべてのコンテンツを削除する拡張メソッドを示します。

    public static void RemoveGridCellChildren(this Grid grid, int row, int col)
    {
        List<UIElement> GridCellChildren = GetGridCellChildren(grid, row, col);
        if (GridCellChildren != null && GridCellChildren.Count > 0)
        {
            foreach (UIElement uie in GridCellChildren)
            {
                grid.Children.Remove(uie);
            }
        }
    }
于 2012-09-25T17:25:39.500 に答える