如何在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的原因。

如何在WPF中清除或更新网格中元素的内容

假设您知道要删除的控件的行和列,您可以这样做

foreach (UIElement control in MyGrid.Children)
{
    if (Grid.GetRow(control) == row && Grid.GetColumn(control) == col)
    {
        MyGrid.Children.Remove(control);
        break;
    }
}

问题是这样的

这是令人费解的,因为代码(在添加行之前)检查是否行数大于2,如果是这种情况,则清除所有的超过行

如果您包含您想要显示在当前项下面的项,您需要增加rowdefinition的数量,而不是保持不变。