0

我正在以编程方式操作 WPF 网格。我有一个动态添加 RowDefinition 的按钮,并且其中一个网格列包含一个用于删除网格中任何 RowDefinition 的按钮。

当我单击“删除”按钮时,我执行:

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

效果很好,我遇到的问题是其余控件的 Grid.Row AttachedProperty 没有自动重新调整。

有没有办法做到这一点?

所以如果我有一个:

<Label Name="lbl1" Grid.Row="0"/>
<Label Name="lbl2" Grid.Row="1"/>
<Label Name="lbl3" Grid.Row="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"/>

但这种情况并非如此。如果没有自动的方法来做到这一点,那么我将不得不自己编写代码。

请指教..

这是我的应用程序的外观: 表单设计器

4

2 回答 2

2

您需要添加代码来自己处理。除非,您不使用网格,而是使用 ListBox,其 ListBoxItem 模板是 3 列和 1 行的网格。一列是红色拖动区域,另一列是蓝色拖动区域,第三列是按钮。您只需要一行,因为每个 ListBox 项目现在将代表一个网格行。

您必须做的第一件事是确保在上面显示的网格中存储数据的集合是 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 回答