2014-09-23 50 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