У меня вопрос. Возможно ли создать динамические кнопки и нажать на него события? Например, я хочу создать 4 кнопки с 4 различными событиями кликов. Нет необходимости делать это с помощью шаблона MVVM. В начале я хотел бы просто знать, возможно ли это, и как я могу это достичь.C# - WPF - создать кнопки и щелкнуть событие программно
ответ
Да, это возможно:
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();
}
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
}
У вас может быть несколько обработчиков событий и при необходимости добавить и удалить их.
Вы меня не понимаете, я хочу создать, например, 2 кнопки и отдельное событие click для каждой из этих кнопок – KinectUser
Один возможный способ связывания 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
) взяты из статьи Джоша Смита:
Я только что ввели код здесь вы можете дважды проверить отсутствие синтаксических ошибок.
Надеюсь, это поможет
спасибо, но я должен признать, что я не понимаю, что Что ж. Думаю, мне нужно кое-что прочитать об этом – KinectUser
Под «созданием динамических кнопок» вы подразумеваете создание кнопок с некоторой коллекцией? или создание кнопки каждый раз, когда выполняется какое-то условие? В любом случае, я просто хочу понять, что вы ищете. –
Да, это возможно и легко сделать, поскольку тайкин и Арман ответили. Однако это не значит, что это хорошая идея! Лучше всего держать элементы управления пользовательского интерфейса в XAML – GreatJobBob
Я бы хотел создать несколько кнопок, но в зависимости от некоторых условий в одном сценарии это будет 3 кнопки в другом сценарии, это будет 5 кнопок и так далее. Так что если лучше всего держать UI в XAML, я могу создать все кнопки в XAML, а затем изменить их видимость в зависимости от значения условия, правильно? – KinectUser