簡體   English   中英

如何在WPF中清除或更新網格中元素的內容

[英]How to clear or update the content of an element in a grid in WPF

我有一個WPF窗口,其中包含2行和一些帶有文本和按鈕的網格,然后單擊按鈕時,代碼將添加一些行,並通過for循環用隨機的文本塊和圖像填充它們。 例如,我調用的在網格的(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);
}

但這還不足以清除其內容...我該怎么辦?

編輯(澄清):

要添加行,我使用類似以下的內容(有些不同,因為有一個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);
                 }

因此,這個想法不是每次都添加新行,而是更新現有行(或者根據需要添加行,可以使用n的不同值調用createGrid)。 因此,我想到了每當我調用該方法並僅添加所需的行時,便清除超過前2行(包含標題和按鈕)的行。 這是第一次檢查和RemoveRange的原因。

假設您知道要刪除的控件的行和列,則可以執行此操作

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

問題是這樣的

令人費解的是,代碼(在添加行之前)檢查行是否大於2,如果是這種情況,它將清除所有超出的行

如果您要包括要顯示在當前項目下方的項目,則需要增加RowDefinitions的數量而不是保持相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM