2014-09-23 105 views
0

我在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(); 
     } 
    } 
} 
+1

所以你的問題是如果知道它的名字(字符串),如何獲得對按鈕的引用。 – kennyzx 2014-09-23 12:48:02

+0

在這裏發佈代碼。您的問題可能會有更好的解決方案。 – 2014-09-23 12:49:07

+0

按鈕是如何創建的?也發佈這個代碼。 – dovid 2014-09-23 12:52:28

回答

1

我認爲你可以做這樣的事情可以說按鈕的名稱是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在他的回答中提到

+0

我也試過簡單的代碼,但沒有任何反應。 – Rok 2014-09-23 13:14:26

+0

你檢查了第一個代碼 – 2014-09-23 13:15:24

+0

還沒有,我在它 – Rok 2014-09-23 13:17:17

1

使用這段代碼:

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"));不工作here

任何補充元素樹在初始加載和處理後必須調用合適的 實現定義XAML名稱範圍的類 的RegisterName。否則,所添加的對象不能通過諸如FindName之類的方法被名稱引用 。僅設置 名稱屬性(或x:名稱屬性)不會將該名稱註冊到任何XAML名稱範圍的 中。

+0

我試過這個,但沒有任何反應。這個方法的參數FindName是我的按鈕名稱正確嗎? – Rok 2014-09-23 13:02:19

+0

這也是一個解決方案是的,謝謝 – Rok 2014-09-23 13:59:54