Динамически добавлять несколько кнопок в окно wpf?
Как добавить несколько кнопок в окно в C#? вот что мне нужно сделать... я получаю несколько пользовательских значений из словаря (в пределах разумного, только значения @ 5-6). для каждого значения, мне нужно создать кнопку. теперь, как мне назвать кнопку, а не текст внутри кнопки? как определить метод "click" для каждой кнопки (все они будут разными)? и как мне стереть кнопку, если она мне больше не нужна?
3 ответов
считайте, что у вас есть StackPanel
по имени 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);
}
чтобы удалить кнопку, Вы можете сделать
sp.Children.Remove((UIElement)this.FindName("Button0"));
надеюсь, что это поможет.
Я бы инкапсулировал все это, обычно не должно быть никакого смысла в названии кнопки. Что-то вроде этого:--4-->
public class SomeDataModel
{
public string Content { get; set; }
public ICommand Command { get; set; }
public SomeDataModel(string content, ICommand command)
{
Content = content;
Command = command;
}
}
затем вы можете создавать модели и помещать их в связываемую коллекцию:
private readonly ObservableCollection<SomeDataModel> _MyData = new ObservableCollection<SomeDataModel>();
public ObservableCollection<SomeDataModel> MyData { get { return _MyData; } }
тогда вам просто нужно добавить и удалить элементы из этого и создать кнопки на лету:
<ItemsControl ItemsSource="{Binding MyData}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Content}" Command="{Binding Command}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
для получения дополнительной информации см. соответствующие статьи на MSDN:
код 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));
}