Dynamically add multiple buttons to wpf window?

前端 未结 3 2016
野的像风
野的像风 2020-12-01 04:17

how would i add multiple buttons to a window in c#? here\'s what i need to do... i\'m getting multiple user values from a dictionary (within reason, only @ 5-6 values). for

相关标签:
3条回答
  • 2020-12-01 04:26

    I would encapsulate the whole thing, there normally should be no point in naming the button. Something like this:

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

    Then you can create models and put them into a bindable collection:

    private readonly ObservableCollection<SomeDataModel> _MyData = new ObservableCollection<SomeDataModel>();
    public ObservableCollection<SomeDataModel> MyData { get { return _MyData; } }
    

    Then you just need to add and remove items from that and create buttons on the fly:

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

    For more info see relevant articles on MSDN:

    Data Binding Overview
    Commanding Overview
    Data Templating Overview

    0 讨论(0)
  • 2020-12-01 04:33

    Xaml code:

    <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>
    

    Code-behind:

    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));
    }
    
    0 讨论(0)
  • 2020-12-01 04:41

    Consider you have a StackPanel named sp

    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);
    }
    

    To remove button you could do

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

    Hope this help.

    0 讨论(0)
提交回复
热议问题