首页 > 解决方案 > 如何在 c# wpf 中将点击处理程序添加到动态创建的按钮(未创建对象)

问题描述

通过使用下面的代码(code1),我创建了一个动态堆栈面板,通过之前生成的选项文件将按钮添加到我的程序中,但我想知道如何将点击监听器添加到生成的每个按钮,因为我无法从每个按钮创建对象。

我尝试使用提到的代码(代码 2)添加点击监听器,但它没有成功,而且我倾向于抛出控件并找到每个按钮,但我得到空引用异常(代码 3)

//code1
StackPanel option_row = new StackPanel();
option_row.Name = "option_row" + i.ToString();
option_row.Children.Add(
               new Button
               {
                   Name = "write_btn" + i.ToString(),
                   VerticalAlignment = VerticalAlignment.Top,
                   Margin = new Thickness(5),
                   Content = "Write",
                   Height = 55,
                   Width = 80
               }
               );
//code2
                option_row.Children.Add(
               new Button
               {
                   Name = "write_btn" + i.ToString(),
                   VerticalAlignment = VerticalAlignment.Top,
                   Margin = new Thickness(5),
                   Content = "Write",
                   Height = 55,
                   Width = 80
               }.Click += new RoutedEventHandler(home_read_click)
               );

private void home_read_click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
        }
//code3
private void btn_sorter()
        {
            for (int i = 0; i < options_num; i++)
            {
                StackPanel x =(StackPanel) FindName("option_row" + i.ToString());
                foreach (Button item in x.Children)
                {
                    if (item.Name.Contains("read"))
                    {
                        home_read_buttons[i] = item.Name;
                    }
                    else if (item.Name.Contains("write"))
                    {
                        home_write_buttons[i] = item.Name;
                    }

                }
       }

        }

代码 2 中的错误:最佳重载方法匹配

System.Windows.Controls.UIElementCollection.Add(System.Windows.UIElement)' has some invalid arguments
Argument 1: cannot convert from 'void' to 'System.Windows.UIElement'

标签: c#

解决方案


您应该首先创建 Button 对象,然后将其分配给 'option_row.Children',如下所示:

var btn = new Button
           {
               Name = "write_btn" + i.ToString(),
               VerticalAlignment = VerticalAlignment.Top,
               Margin = new Thickness(5),
               Content = "Write",
               Height = 55,
               Width = 80
           };
 btn.Click += new RoutedEventHandler(home_read_click);
 option_row.Children.Add(btn);

推荐阅读