Ajouter dynamiquement plusieurs boutons à la fenêtre wpf?

comment ajouter plusieurs boutons à une fenêtre en c#? voici ce que je dois faire... je reçois plusieurs valeurs d'utilisateur d'un dictionnaire (dans la raison, seulement @ 5-6 valeurs). pour chaque valeur, je dois créer un bouton. maintenant, comment je nomme le bouton, pas le texte dans le bouton? comment définir la méthode "clic" pour chaque bouton (ils seront tous différents)? et comment puis-je effacer le bouton si je n'en veux plus?

10
demandé sur H.B. 2011-05-08 23:20:56

3 réponses

Considérez que vous avez un StackPanel nommé 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);
}

pour enlever le bouton vous pouvez faire

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

Espérons que cette aide.

26
répondu FIre Panda 2011-05-08 19:43:46

je voudrais encapsuler l'ensemble de la chose, il ne devrait normalement pas y avoir de point dans le nom du bouton. Quelque chose comme ceci:

public class SomeDataModel
{
    public string Content { get; set; }

    public ICommand Command { get; set; }

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

alors vous pouvez créer des modèles et les mettre dans une collection liable:

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

alors vous avez juste besoin d'ajouter et de supprimer des éléments à partir de cela et de créer des boutons à la volée:

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

pour plus d'information voir les articles pertinents sur MSDN:

Aperçu De La Liaison Des Données

Commandant Aperçu

Modèles De Données Vue D'Ensemble

27
répondu H.B. 2011-05-08 20:28:48

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

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));
}
10
répondu Ben 2011-05-08 20:30:29