动态地将多个按钮添加到 wpf 窗口

本文关键字:添加 wpf 窗口 按钮 动态 | 更新日期: 2023-09-27 17:55:18

如何在 C# 中向窗口添加多个按钮? 这是我需要做的...我从字典中获取多个用户值(在合理范围内,只有@ 5-6个值)。对于每个值,我需要创建一个按钮。 现在,如何命名按钮,而不是按钮中的文本? 如何为每个按钮定义"单击"方法(它们都将不同)? 如果我不再需要按钮,如何擦除它?

动态地将多个按钮添加到 wpf 窗口

我会封装整个事情,通常命名按钮应该没有意义。像这样:

public class SomeDataModel
{
    public string Content { get; }
    public ICommand Command { get; }
    public SomeDataModel(string content, ICommand command)
    {
        Content = content;
        Command = command;
    }
}

然后,您可以创建模型并将其放入可绑定的集合中:

public ObservableCollection<SomeDataModel> MyData { get; } =
     new ObservableCollection<SomeDataModel>();

然后,您只需从中添加和删除项目并即时创建按钮:

<ItemsControl ItemsSource="{Binding MyData}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Content}" Command="{Binding Command}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

有关详细信息,请参阅 MSDN 上的相关文章:

数据绑定概述
命令概述
数据模板化概述

假设你有一个名为 sp 的StackPanel

for(int i=0; i<5; i++)
{
    System.Windows.Controls.Button newBtn = new Button();
    newBtn.Content = i.ToString();
    newBtn.Name = "Button" + i.ToString();
    sp.Children.Add(newBtn);
}

删除按钮,你可以做

sp.Children.Remove((UIElement)this.FindName("Button0"));

希望这有帮助。

Xaml 代码:

<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
  <UniformGrid x:Name="grid">
  </UniformGrid>
</Window>

代码隐藏:

public MainWindow()
{
  InitializeComponent();
  for (int i = 0; i < 10; ++i)
  {
    Button button = new Button()
      { 
        Content = string.Format("Button for {0}", i),
        Tag = i
      };
    button.Click += new RoutedEventHandler(button_Click);
    this.grid.Children.Add(button);
  }
}
void button_Click(object sender, RoutedEventArgs e)
{
  Console.WriteLine(string.Format("You clicked on the {0}. button.", (sender as Button).Tag));
}