如何在WPF中清除或更新网格中元素的内容
本文关键字:元素 网格 更新 WPF 清除 | 更新日期: 2023-09-27 17:53:06
我有一个WPF窗口与2行网格和一些列的文本和按钮,然后当我点击一个按钮的代码添加一些行,并通过循环随机文本块和图像填充它们。例如,在网格的(I,j)单元格中添加文本为s的TextBlock的方法是
public void createTextBlock(int i, int j, string s)
{
TextBlock tb = new TextBlock();
//Properties
tb.Foreground = Brushes.Navy;
tb.FontFamily = new FontFamily("Century Gothic");
tb.FontSize = 16;
tb.FontWeight = FontWeights.UltraBold;
tb.TextWrapping = TextWrapping.Wrap;
tb.VerticalAlignment = VerticalAlignment.Center;
tb.HorizontalAlignment = HorizontalAlignment.Center;
tb.Text = s;
//Add to the Grid
MyGrid.Children.Add(tb);
Grid.SetRow(tb, i);
Grid.SetColumn(tb, j);
}
和添加图像的方法类似。问题是,当我再次点击时,新的文本块和图像被添加到旧的上面,我不知道如何更新内容或在添加另一个之前清除它。
这是令人费解的,因为代码(在添加行之前)检查行是否超过2,如果是这种情况,它清除所有超过的行:
if (MyGrid.RowDefinitions.Count > 2)
{
MyGrid.RowDefinitions.RemoveRange(2, MyGrid.RowDefinitions.Count-2);
}
但这并不足以清除它们的内容…我该怎么做呢?
EDIT (to澄清):
要添加行,我使用这样的东西(有点不同,因为有一个switch调用,但它不修改本质)
public void createGrid(int n)
{
//remove rows if present
if (MyGrid.RowDefinitions.Count > 2)
{
MyGrid.RowDefinitions.RemoveRange(2, MyGrid.RowDefinitions.Count-2);
}
//permutation
int[] permutation = shuffle(deck.Count);
for (int i = 2; i < n + 2; i++)
{
RowDefinition row = new RowDefinition();
MyGrid.RowDefinitions.Add(row);
row.Height = new GridLength(200, GridUnitType.Pixel);
//add image
createImage(i, 0, deck[permutation[i - 2]].ImmPath);
//add textblock in center column with text chosen
//from a jagged array
createTextBlock(i, 1, value[0][i-2]);
//add textblock in right column
createTextBlock(i, 2, deck[permutation[i - 2]].Meaning);
}
所以这个想法不是每次添加新行,而是更新现有的行(或添加它们,如果需要的话,createGrid可以用不同的值调用n)。所以我想到了擦除超过前2行的想法(其中包含标题和按钮)每次我调用该方法,只添加需要的行。这就是第一次检查和RemoveRange的原因。
假设您知道要删除的控件的行和列,您可以这样做
foreach (UIElement control in MyGrid.Children)
{
if (Grid.GetRow(control) == row && Grid.GetColumn(control) == col)
{
MyGrid.Children.Remove(control);
break;
}
}
问题是这样的
这是令人费解的,因为代码(在添加行之前)检查是否行数大于2,如果是这种情况,则清除所有的超过行
如果您包含您想要显示在当前项下面的项,您需要增加rowdefinition的数量,而不是保持不变。