WPF C#为动态创建的按钮创建Click事件

Posted

技术标签:

【中文标题】WPF C#为动态创建的按钮创建Click事件【英文标题】:WPF C# create Click event for dynamically created button 【发布时间】:2021-08-09 01:02:15 【问题描述】:

我正在开发一个新按钮创建 x 次的项目(为了这个问题:x 是由用户输入定义的。在最终版本中,这将由条目的数量来处理SQL 数据库)。 然后这些按钮进入 ScrollViewer。 我需要每个动态创建的按钮在点击时都有一个独特的事件。 因此,如果单击按钮 1,则正在执行事件 1,依此类推... 这当然意味着如果创建了 5 个按钮,那么每个按钮都需要触发自己的功能。 函数的名称可以命名为 BtnClick + i。 那么什么是可行的解决方案呢? 无法让 EventHandler 以我需要的方式工作。

代码如下:

    private void TextEnter(object sender, KeyEventArgs e)
    
        if (Keyboard.IsKeyDown(Key.Enter))
        
            TextBox testBox = (TextBox)sender;
            int entry = Int32.Parse(testBox.Text);
            Console.WriteLine(entry);

            for (int i = 1; i < entry + 1; i++)
            
                Button testBtn = new Button();
                testBtn.Content = i;
                testBtn.FontSize = 20;
                testBtn.Foreground = new SolidColorBrush(Colors.White);
                testBtn.Width = ListPanel.ActualWidth;
                testBtn.Height = 60;
                testBtn.FontWeight = FontWeights.Bold;
                testBtn.Background = new SolidColorBrush(Colors.Transparent);
                testBtn.Click += new EventHandler();
                ListPanel.Children.Add(testBtn);
            

【问题讨论】:

看这里enter link description here和这里enter link description here 【参考方案1】:

您可以使用相同的事件处理程序并打开ButtonContent

private void TextEnter(object sender, KeyEventArgs e)

    if (Keyboard.IsKeyDown(Key.Enter))
    
        ...
        for (int i = 1; i < entry + 1; i++)
        
            Button testBtn = new Button();
            testBtn.Content = i;
            testBtn.FontSize = 20;
            testBtn.Foreground = new SolidColorBrush(Colors.White);
            testBtn.Width = ListPanel.ActualWidth;
            testBtn.Height = 60;
            testBtn.FontWeight = FontWeights.Bold;
            testBtn.Background = new SolidColorBrush(Colors.Transparent);
            testBtn.Click += TestBtn_Click;
            ListPanel.Children.Add(testBtn);
        
    


private void TestBtn_Click(object sender, RoutedEventArgs e)

    Button button = (Button)sender;
    int content = Convert.ToInt32(button.Content);
    switch (content)
    
        case 1:
            //do something for the first button
            break;
        case 2:
            //do something for the second button...
            break;
    

或者使用匿名内联函数创建事件处理程序:

testBtn.Click += (ss,ee) =>  ShowPage(i); ;

【讨论】:

是的,看起来不错。但理论上可以创建 1000 个按钮。对所有案例进行硬编码并不是我所期待的。有没有办法为按钮的数量创建一个新的案例? 所以不是在单个方法中使用switch 语句,而是要创建1000 种不同的方法...?唔。为什么你甚至需要以不同的方式处理每个按钮的点击? 例如点击按钮1和按钮900有什么区别? 最后的每个按钮都会显示一个包含不同数据集的不同页面。最后,用户可以添加一个包含姓名、日期等的新条目。然后,此数据将保存到 sql server。当程序启动时,它会检查这些条目中有多少在数据库中并创建足够数量的按钮 - 每个按钮一个。单击该按钮时,将显示一个页面,显示该条目的数据保存在数据库中。 然后使用匿名内联函数?看到我的编辑了吗?

以上是关于WPF C#为动态创建的按钮创建Click事件的主要内容,如果未能解决你的问题,请参考以下文章

动态创建到 WPF 表单的用户控件上的按钮单击事件

在WPF中,如何遍历动态生成的多个button按钮

如何在动态按钮上创建动态按钮单击事件?

WPF代码触发Button点击事件

wpf如何动态改变button的事件.

无法在 WPF 中检索动态生成的按钮的内容