[英]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.