Динамически добавить несколько кнопок в окно wpf? - PullRequest
14 голосов
/ 08 мая 2011

как бы добавить несколько кнопок в окно в C #?вот что мне нужно сделать ... я получаю несколько пользовательских значений из словаря (в пределах разумного, только @ 5-6 значений).для каждого значения мне нужно создать кнопку.Теперь, как я называю кнопку, а не текст внутри кнопки?как определить метод «щелчка» для каждой кнопки (все они будут разными)?и как мне стереть кнопку, если я больше не хочу ее?

Ответы [ 3 ]

29 голосов
/ 08 мая 2011

Предположим, у вас есть 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"));

Надеюсь, это поможет.

28 голосов
/ 09 мая 2011

Я бы инкапсулировал все это, обычно нет смысла называть кнопку. Примерно так:

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:

Обзор привязки данных
Обзор команд
Обзор шаблонов данных

11 голосов
/ 08 мая 2011

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...