WPF/C#-向列表框内动态创建的按钮添加功能

WPF/C#-向列表框内动态创建的按钮添加功能,c#,wpf,listbox,C#,Wpf,Listbox,我有一个按钮,每次单击时都会将此StackPanel添加到列表框中。里面有一个按钮。我正试图找出如何向它正在添加的按钮添加代码。理想情况下,我希望按钮是一个delete按钮,这样它就可以删除列表中的元素(本身)。我只是想弄清楚如何为动态创建的按钮添加功能。希望这是有道理的 谢谢你的帮助 private void Button_Click_1(object sender, RoutedEventArgs e) { StackPanel stackPanel = ne

我有一个按钮,每次单击时都会将此StackPanel添加到列表框中。里面有一个按钮。我正试图找出如何向它正在添加的按钮添加代码。理想情况下,我希望按钮是一个delete按钮,这样它就可以删除列表中的元素(本身)。我只是想弄清楚如何为动态创建的按钮添加功能。希望这是有道理的

谢谢你的帮助

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        StackPanel stackPanel = new StackPanel();
        stackPanel.Orientation = System.Windows.Controls.Orientation.Horizontal;

        CheckBox checkBox = new CheckBox();
        checkBox.IsChecked = true;

        TextBox textBox = new TextBox();
        textBox.Width = 100;
        textBox.Text = textBox1.Text;

        Button button = new Button();  //HOW DO I ADD CODE TO THIS BUTTON?

        stackPanel.Children.Add(checkBox);
        stackPanel.Children.Add(textBox);
        stackPanel.Children.Add(button);  //HOW DO I ADD CODE TO THIS BUTTON?

        listBox1.Items.Add(stackPanel);
    }

您可以通过编程方式将单击处理程序添加到按钮,如下所示:

    Button button = new Button();  //HOW DO I ADD CODE TO THIS BUTTON?
    button.Click += btn_Click;

    stackPanel.Children.Add(checkBox);
    stackPanel.Children.Add(textBox);
    stackPanel.Children.Add(button);  //HOW DO I ADD CODE TO THIS BUTTON?
然后需要单击事件处理程序

    void btn_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        // your code to execute when the button is clicked.
        stackPanel.Items.Remove(button);
    }

您可以通过编程方式将单击处理程序添加到按钮,如下所示:

    Button button = new Button();  //HOW DO I ADD CODE TO THIS BUTTON?
    button.Click += btn_Click;

    stackPanel.Children.Add(checkBox);
    stackPanel.Children.Add(textBox);
    stackPanel.Children.Add(button);  //HOW DO I ADD CODE TO THIS BUTTON?
然后需要单击事件处理程序

    void btn_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        // your code to execute when the button is clicked.
        stackPanel.Items.Remove(button);
    }

这是最简单的设置。理想情况下,您需要更多的错误处理等

Button button = new Button();
button.Click += (s, args) => { listBox1.Items.Remove(stackPanel); };

这是最简单的设置。理想情况下,您需要更多的错误处理等

Button button = new Button();
button.Click += (s, args) => { listBox1.Items.Remove(stackPanel); };
试试这个

添加具有文本块和按钮的Stackpanel

private void OnSaveClick(object sender, RoutedEventArgs e)
        {
            StackPanel stp = new StackPanel();
            stp.Orientation = Orientation.Horizontal;
            stp.Children.Add(new TextBlock()
            {
                 Text =  string.Format("Item {0}",  lstitems.Items.Count), 
                  HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch
            });

           Button btn = new Button();
           btn.Content = string.Format("Delete Item {0}",  lstitems.Items.Count);
           btn.Height = 25;
           btn.Width = 100;
           btn.HorizontalAlignment = System.Windows.HorizontalAlignment.Right;
           btn.Click += btnDeleteClick;


           stp.Children.Add(btn);

           lstitems.Items.Add(stp);
        }
删除按钮单击处理程序

  void btnDeleteClick(object sender, RoutedEventArgs e)
        {
            Button btn = (Button)sender;
            if (btn != null)
            {
               var st = FindParent<StackPanel> (btn); //stackpanel as we have added item as stackpanel.
               if (st != null)
                   lstitems.Items.Remove(st);
            }
        }
void btndeleteck(对象发送方,路由目标)
{
按钮btn=(按钮)发送器;
如果(btn!=null)
{
var st=FindParent(btn);//stackpanel,因为我们已将项添加为stackpanel。
如果(st!=null)
lstitems.Items.Remove(st);
}
}
要在可视树中查找对象的类型,请执行以下操作

    public  T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
    {
        var parent = VisualTreeHelper.GetParent(dependencyObject);

        if (parent == null) return null;

        var parentT = parent as T;
        return parentT ?? FindParent<T>(parent);
    }
public T FindParent(DependencyObject DependencyObject),其中T:DependencyObject
{
var parent=VisualTreeHelper.GetParent(dependencyObject);
if(parent==null)返回null;
var parentT=作为T的父项;
返回父母??找到父母(父母);
}
试试这个

添加具有文本块和按钮的Stackpanel

private void OnSaveClick(object sender, RoutedEventArgs e)
        {
            StackPanel stp = new StackPanel();
            stp.Orientation = Orientation.Horizontal;
            stp.Children.Add(new TextBlock()
            {
                 Text =  string.Format("Item {0}",  lstitems.Items.Count), 
                  HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch
            });

           Button btn = new Button();
           btn.Content = string.Format("Delete Item {0}",  lstitems.Items.Count);
           btn.Height = 25;
           btn.Width = 100;
           btn.HorizontalAlignment = System.Windows.HorizontalAlignment.Right;
           btn.Click += btnDeleteClick;


           stp.Children.Add(btn);

           lstitems.Items.Add(stp);
        }
删除按钮单击处理程序

  void btnDeleteClick(object sender, RoutedEventArgs e)
        {
            Button btn = (Button)sender;
            if (btn != null)
            {
               var st = FindParent<StackPanel> (btn); //stackpanel as we have added item as stackpanel.
               if (st != null)
                   lstitems.Items.Remove(st);
            }
        }
void btndeleteck(对象发送方,路由目标)
{
按钮btn=(按钮)发送器;
如果(btn!=null)
{
var st=FindParent(btn);//stackpanel,因为我们已将项添加为stackpanel。
如果(st!=null)
lstitems.Items.Remove(st);
}
}
要在可视树中查找对象的类型,请执行以下操作

    public  T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
    {
        var parent = VisualTreeHelper.GetParent(dependencyObject);

        if (parent == null) return null;

        var parentT = parent as T;
        return parentT ?? FindParent<T>(parent);
    }
public T FindParent(DependencyObject DependencyObject),其中T:DependencyObject
{
var parent=VisualTreeHelper.GetParent(dependencyObject);
if(parent==null)返回null;
var parentT=作为T的父项;
返回父母??找到父母(父母);
}

不应该是
按钮。单击+=新建路由EventHandler(btn\u单击)代码错误:
堆栈面板
被添加到
列表框1
,而不是
按钮
@user2378527。这同样有效,它们在引擎盖下做相同的事情。应该不是
按钮。单击+=新建路由EventHandler(btn\U单击)代码错误:
stackPanel
被添加到
listBox1
,而不是
按钮
@user2378527。这同样有效,它们在引擎盖下做同样的事情。还没有尝试过这个方法,但如果这个方法有效,我最喜欢它。很好,很简单。我还没有尝试过这个方法,但是如果这个方法有效的话,我最喜欢它。nice和simplei最终使用了这个解决方案,因为它帮助我删除了它所在的行,而这正是我要查找的行。thanksi实际上最终使用了这个解决方案,因为它帮助我删除了它所在的行,而这正是我要查找的行。谢谢