2017-02-03 5 views
1

У меня вопрос. Возможно ли создать динамические кнопки и нажать на него события? Например, я хочу создать 4 кнопки с 4 различными событиями кликов. Нет необходимости делать это с помощью шаблона MVVM. В начале я хотел бы просто знать, возможно ли это, и как я могу это достичь.C# - WPF - создать кнопки и щелкнуть событие программно

+1

Под «созданием динамических кнопок» вы подразумеваете создание кнопок с некоторой коллекцией? или создание кнопки каждый раз, когда выполняется какое-то условие? В любом случае, я просто хочу понять, что вы ищете. –

+1

Да, это возможно и легко сделать, поскольку тайкин и Арман ответили. Однако это не значит, что это хорошая идея! Лучше всего держать элементы управления пользовательского интерфейса в XAML – GreatJobBob

+0

Я бы хотел создать несколько кнопок, но в зависимости от некоторых условий в одном сценарии это будет 3 кнопки в другом сценарии, это будет 5 кнопок и так далее. Так что если лучше всего держать UI в XAML, я могу создать все кнопки в XAML, а затем изменить их видимость в зависимости от значения условия, правильно? – KinectUser

ответ

1

Да, это возможно:

public MainWindow() 
    { 
     InitializeComponent(); 

     var button = new Button() {Content = "myButton"}; // Creating button 
     button.Click += Button_Click; //Hooking up to event 
     myGrid.Children.Add(button); //Adding to grid or other parent 

    } 

    private void Button_Click(object sender, RoutedEventArgs e) //Event which will be triggerd on click of ya button 
    { 
     throw new NotImplementedException(); 
    } 
1

Yeap.

public MainWindow() 
    { 
     InitializeComponent(); 

     var btn1 = new Button{Content = "btn1"}; 

     //add event handler 1 
     btn1.Click += ClickHandler1; 

     //removes event handler 1 
     btn1.Click -= ClickHandler1; 

     //add event handler 2 
     btn1.Click += ClickHandler2; 

     Panel.Children.Add(btn1); 

    } 

    private void ClickHandler1(object sender, RoutedEventArgs e) 
    { 
     //do something 
    } 

    private void ClickHandler2(object sender, RoutedEventArgs e) 
    { 
     //do something 
    } 

    private void ClickHandler3(object sender, RoutedEventArgs e) 
    { 
     //do something 

    } 

У вас может быть несколько обработчиков событий и при необходимости добавить и удалить их.

+0

Вы меня не понимаете, я хочу создать, например, 2 кнопки и отдельное событие click для каждой из этих кнопок – KinectUser

0

Один возможный способ связывания ItemsSource свойство коллекции в вашей модели представления, то есть

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

Это, конечно, с помощью MVVM. Вид Модель будет иметь какой-то коллекции CommandViewModel, что-то вроде

public class ControlViewModel 
    { 
     public Collection<CommandViewModel> Commands { get; } 

     public ControlViewModel() 
     { 
      // Here have logic to determine which commands are added to the collection 
     var command1 = new RelayCommand(p => ActionForButton1()); 
     var command2 = new RelayCommand(p => ActionForButton2()); 

     Commands = new Collection<CommandViewModel>(); 
     Commands.Add(new CommandViewModel(command1, "Button 1")); 
     Commands.Add(new CommandViewModel(command2, "Button 2")); 

     } 

     private void ActionForButton1() 
     { 
     // .... 
     } 

     private void ActionForButton2() 
     { 
     // .... 
     } 
    } 

Некоторые из классов (CommandViewModel и RelayCommand) взяты из статьи Джоша Смита:

https://msdn.microsoft.com/en-us/magazine/dd419663.aspx?tduid=(a4fd6aaf12efe5326f52547f7c7c51ff)(256380)(2459594)(TnL5HPStwNw-EI6zVtliyeYaJRVV4Lm6cA)()

Я только что ввели код здесь вы можете дважды проверить отсутствие синтаксических ошибок.

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

+0

спасибо, но я должен признать, что я не понимаю, что Что ж. Думаю, мне нужно кое-что прочитать об этом – KinectUser