【问题标题】:How to manage with dynamic CheckBox in C# WPF application?如何在 C# WPF 应用程序中使用动态复选框进行管理?
【发布时间】:2013-02-16 00:56:06
【问题描述】:

我创建了一个复选框列表,其中动态添加了 8 个复选框。我的程序的想法是: 当一个框被选中时,我的绘图仪上会出现一个图表,当我取消选中它时,它就会消失。

我的问题是我不知道如何管理事件来做到这一点,因为我动态添加了复选框,并且我需要 8 个不同的事件来处理 8 个不同的图表。

谢谢。

【问题讨论】:

  • 愿意发布您的代码吗?
  • Eventhandlers in WPF。我爱我一些谷歌。您也应该爱上一些 Google!
  • 它不会有帮助...我的代码没有问题。
  • @user2076231 如果您确实关心在 WPF 中以正确的方式做事,请告诉我,我会发布正确的答案。

标签: c# wpf events dynamic checkbox


【解决方案1】:

您可以为所有这些事件使用一个事件。在事件内部,您将获得触发事件的控件的名称。像这样的:

 private void CheckBox_Click(object sender, RoutedEventArgs e)
 {
     CheckBox senderChk = sender as CheckBox;
     switch (senderChk.Name)
     {
         case "checkBox1":  //do something 
         case "checkBox2":  //do something 
     }
 }

【讨论】:

    【解决方案2】:

    这里的答案建议使用 .Name 属性,但动态创建的复选框现在可以正常工作。

    CheckBox chx;
    chx.Tag = "Chart 1"; // put these tags in an enum or at least constants
    chx.Click += chx_Click; 
    
    void chx_Click(object sender, RoutedEventArgs e)
    {
        CheckBox chx = sender as CheckBox;
        if (chx != null && chx.Tag != null)
        {
            switch (chx.Tag)
            {
                case "Chart 1": 
                            myChart1.Visibility = chx.IsChecked? Visibility.Visible: Visibility.Collapsed;  
                    break;
                case "Chart 2": //...
                    break;
                default:
                    break;
            }
        }
    }
    

    【讨论】:

    • 对不起,但这也是一个非常糟糕的解决方案,它以更糟糕的 winforms 方式使用 WPF。我的意思是,标签属性?请...
    • 使用 Tag 属性是你所反对的吗?我的意思是 OP 已经通过动态创建复选框而不是在 XAML 中定义它们(可能是模板化的)来滥用 WPF,将 IsChecked 绑定到使用属性转换器的可见性。他问了一个问题,我回答了,不代表我同意他的设计。
    • 正确。所谓的“动态”用户界面就是问题所在。
    【解决方案3】:

    事件处理程序的“sender”参数指示哪个控件引发了事件。

    在某个地方,您创建了一个控件。确保在某处保留对它的引用,作为成员变量、字典或其他任何内容。

    然后,在您的事件处理程序中,执行以下操作:

    If(sender==myControl)
    {
       ...do something...
    }
    Elseif (sender==myOtherControl)
    {
        ...do something else...
    }
    

    【讨论】:

    • 抱歉,这是一个非常糟糕的解决方案,它以 winforms 的方式使用 WPF。
    • @HighCore,可能是一个公平的评论,但请解释为什么这是一个糟糕的方式?
    • @ImmortalBlue 因为UI is Not Data。他应该使用ItemsControl 和适当的DataTemplate 开始,然后他可以针对Data Items 而不是UI 编写应用程序逻辑。
    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 2016-12-15
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2023-03-13
    相关资源
    最近更新 更多