【问题标题】:C# - WPF - create buttons and click event programaticallyC# - WPF - 以编程方式创建按钮和单击事件
【发布时间】:2017-06-21 03:59:26
【问题描述】:

我有一个问题。是否可以动态创建按钮并单击事件? 例如,我想创建 4 个具有 4 个不同点击事件的按钮。没有必要使用 MVVM 模式。一开始我只想知道这是否可能以及如何实现。

【问题讨论】:

  • “创建动态按钮”是指从某个集合中创建按钮吗?或者每次满足某些条件时创建一个按钮?无论哪种方式都是可能的,我只是想了解您在寻找什么。
  • 是的,正如 taquion 和 Arman 所回应的那样,这是可能且容易做到的。但是,这并不意味着这是一个好主意!最好将 UI 控件保留在 XAML 中
  • 我想创建几个按钮,但取决于某些条件,在一种情况下它将是 3 个按钮,在另一种情况下它将是 5 个按钮,依此类推。因此,如果真的最好将 UI 保留在 XAML 中,我可以在 XAML 中创建所有按钮,然后仅根据条件值更改它们的可见性,对吗?
  • 您可能希望将 ObservableCollection 绑定到 ListBox,其中 ListBoxItemTemplate 包含一个按钮。按钮的单击事件会查看发送者,然后获取 DataContext。代码可以根据 DataContext 做不同的事情。您也可以在 CodeBehind 中执行此操作,但通常不建议这样做。
  • Patrick 你能给我举个例子吗?关联 ?还是一段代码?因为我想更好地理解你的意思

标签: c# wpf events button click


【解决方案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();
    }

【讨论】:

    【解决方案2】:

    是的。

     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 个按钮并为每个按钮创建单独的点击事件
    【解决方案3】:

    一种可能的方法是将ItemsSource 属性绑定到视图模型中的集合,即

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

    这当然是使用 MVVM。 View Model 会有某种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()
          {
             // ....
          }
       }
    

    一些类(CommandViewModelRelayCommand)取自Josh Smith's article。我只是在这里输入代码,您可能需要仔细检查是否有语法错误。

    希望对你有帮助

    【讨论】:

    • 谢谢,但我必须承认我不太了解。我想我需要阅读更多相关内容
    猜你喜欢
    • 2017-06-17
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    相关资源
    最近更新 更多