簡體   English   中英

如何刪除動態創建的按鈕

[英]How to delete dynamically created buttons

我正在c#中創建一個WPF應用程序,並且我想知道假設我知道按鈕名稱,如何刪除網格中動態創建的按鈕。

說明:我有16個按鈕,當我單擊一個按鈕時,我想同時刪除兩個按鈕。 我有他們的名字,但我不知道該如何使用。

這是我嘗試過的方法,但這僅在您嘗試刪除單擊的按鈕時才有用。

public void delete(Button x)
{
    myGrid.Children.Remove(x);
}

希望您能理解我的問題,因為我的英語不是我的母語。

我的代碼:

for (int i=1; i<17; i++) 
{
    Button x = new Button();
    x.MinHeight = 100;
    x.MinWidth = 100;
    var brush = new ImageBrush();
    brush.ImageSource = new BitmapImage(new Uri(@"C:path\slikeSpomin\hrbtnaStran.png", UriKind.Relative));
    x.Background = brush;
    int ime = r.Next(0, max);
    //x.Content = pari[ime];
    x.Name = pari[ime];
    pari.RemoveAt(ime);
    max--;
    x.VerticalAlignment = VerticalAlignment.Top;
    x.HorizontalAlignment = HorizontalAlignment.Left;                
    x.Margin = new Thickness(a, b, 0, 0);
    a = a + 130;
    if (i % 4 == 0)
    {
        b = b + 120;
        a = 10;
    }
    x.Click += new RoutedEventHandler((obj, ev) => btnClick(x));
    gumbiDodani.Insert(0, x);
    gridSlike.Children.Add(x);

} // Here i create my buttons

private void btnClick(Button x)
{
    var brush = new ImageBrush();
    string slika = x.Name;
    sliki.Add(slika);
    brush.ImageSource = new BitmapImage(new Uri(@"path\slikeSpomin\" + slika + ".png", UriKind.Relative));
    x.Background = brush;
    //zaženem metodo, ki preverja enake in se izvede samo v primeru, če so enake
    enake(slika, x);
}
List<string> ksad = new List<string>();
public void enake(string ime, Button x)
{
    ksad.Add(ime);
    if (ksad.Count == 2)
    {
        string prva = ksad[0];
        string druga = ksad[1];
        if (prva.Equals(druga + "a") || druga.Equals(prva + "a"))
        {

            string imeGumba = x.Name;
            MessageBox.Show(prva + "   " + druga);
            //this.gridSlike.Children.re
            gridSlike.Children.Remove(x);
            ksad.Clear();
        }
        else 
        {
            MessageBox.Show("happy");
            ksad.Clear();
        }
    }
}

使用這段代碼:

UIElement btn = null;
foreach (Control c in sp.Children)
    if (c.Name == "Button1")
        btn = (UIElement)c;
sp.Children.Remove(btn);

順便說一句,我發現了這段代碼為什么是sp.Children.Remove((UIElement)this.FindName("Button0")); 在這里不起作用:

初始加載和處理后,元素樹中的任何添加都必須為定義XAML名稱范圍的類調用RegisterName的適當實現。 否則,不能通過諸如FindName之類的方法按名稱引用添加的對象。 僅設置Name屬性(或x:Name Attribute)不會將該名稱注冊到任何XAML名稱范圍中。

我想你可以做這樣的事情,可以說按鈕名稱是B1

 List<Button> remove = new List<Button>();
        foreach (var children in myGrid.Children)
        {
            if ((children.GetType() == typeof(Button)))
            {
                if ((children as Button).Name == "B1")
                    remove.Add(children as Button);
            }
        }
        foreach (var ch in remove)
        {
            myGrid.Children.Remove(ch as Button);
        }

或簡單地

myGrid.Children.Remove((UIElement) this.FindName("B1"));

就像他在回答中提到的Asfk

也許是因為沒有處理它。 (很多人都沒有提到這一點。)讓我們從AsfK的答案中獲取代碼:

sp.Children.Remove(btn);

嘗試將其更改為:

btn.Dispose();

(如果下面的代碼不起作用,或者給出錯誤嘗試:“ sp.Children.btn.Dispose(); ”)

希望能幫助到你。

暫無
暫無

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

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