这是添加一行包含四个元素的代码:
private void ItemAdd(object sender, RoutedEventArgs e)
{
Button deleteButton = new Button { Visibility = Visibility.Visible, Content = "X" };
TextBox itemName = new TextBox { MinHeight = 10, MaxHeight = 40 };
TextBox weight = new();
Label number = new Label();
RowDefinition row = new()
{ Height = GridLength.Auto, MinHeight = 10 };
currentRow = row;
NamesList.RowDefinitions.Add(row);
number.Content = GetCurrentRowIndex(NamesList, row) - 1;
AddAt(NamesList, number, GetCurrentRowIndex(NamesList, row), 0);
AddAt(NamesList, itemName, GetCurrentRowIndex(NamesList, row), 1);
AddAt(NamesList, weight, GetCurrentRowIndex(NamesList, row), 2);
AddAt(NamesList, deleteButton, GetCurrentRowIndex(NamesList, row), 3);
/*also i have this for deleting row, but next going method that not work*/
void DeleteCurrentRow(Grid grid, RowDefinition row)
{
grid.RowDefinitions.Remove(row);
}
}
我尝试为假设的当前行插入变量
RowDefinition currentRow;
但没用
RowDefinition
只是一个描述网格布局的布局对象。它不会映射到实际元素或渲染的网格行。 RowDefinition
告诉 Grid
它有一行具有特定属性 - 它是一个描述符。如果删除定义,元素仍然是 Grid
的子元素,因此可见。
除非您通过行索引跟踪元素,例如使用地图,否则必须通过查询附加的
Grid.Children
属性来过滤 Grid.Row
集合:
void DeleteCurrentRow(Grid grid, RowDefinition rowDefinition)
{
// Consider to pass in the row index instead of the RowDefinition object
int indexOfRowToRemove = grid.RowDefinitions.IndexOf(rowDefinition);
IEnumerable<UIElement> rowElements = grid.Children
.Cast<UIElement>()
.Where(element => Grid.GetRow(element) == indexOfRowToRemove);
foreach (var rowElement in rowElements)
{
grid.Children.Remove(rowElement);
}
}
如果您必须使用数据表,您应该更喜欢
DataGrid
。 Grid
用于排列 UI 布局的 UI 元素,而不是显示数据。
在 WPF 中,您总是更喜欢在 XAML 中创建布局,因为它更容易。您无法在学习 WPF 的同时避免 XAML。当你以后开始学习XAML时你会后悔的。