如何修改已禁用复选框的可视状态以启用?

时间:2013-04-02 14:20:01

标签: c# wpf-controls

我正在设计一个比较对话框(在网格中显示几个具有特征的小部件)。功能部分列出了所有可用功能,每个功能都有一个复选框。如果零件具有该功能,则选中该复选框。这些复选框需要是只读的,所以我isEnabled = false。但在视觉上,复选框(和标签内容)显示为灰色。

以下是一些要点:

  • 该复选框是零件是否具有特征的可视指示器。没有要求互动。
  • 要求是一个复选框;我必须说服那些使用不同东西的权力。

我想要的是一种简单的方法来设置/控制复选框(及其内容),使其看起来已启用,但不会对用户输入作出反应。

3 个答案:

答案 0 :(得分:0)

通过继承CheckBox创建自定义控件,并在其构造函数中为其创建Click处理程序。在该Click处理程序中,输入以下代码:

((CheckBox)sender).Checked = !((CheckBox)sender).Checked;

这是一个完整的例子。

对于Windows窗体:

namespace System.Windows.Forms
{
    public class UnChangingCheckBox : System.Windows.Forms.CheckBox
    {
        public UnChangingCheckBox()
        {
            this.Click += new EventHandler(UnChangingCheckBox_Click);
        }

        void UnChangingCheckBox_Click(object sender, EventArgs e)
        {
            ((CheckBox)sender).Checked = !((CheckBox)sender).Checked;
        }
    }
}

对于WPF:

namespace System.Windows.Controls
{
    public class UnchangingCheckBox : System.Windows.Controls.CheckBox
    {
        public UnchangingCheckBox()
        {
            this.Click += new System.Windows.RoutedEventHandler(UnchangingCheckBox_Click);
        }

        void UnchangingCheckBox_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            if (((CheckBox)sender).IsChecked.HasValue)
                ((CheckBox)sender).IsChecked = !((CheckBox)sender).IsChecked; 
        }
    }
}

如果将上述代码放在Windows窗体或WPF项目的新类中,它们将在工具箱中显示为新工具。然后,您需要做的就是将新的“UnchangingCheckBox”控件拖到您使用CheckBox的表单上。您无需在表单上进行任何编码。

使用这种方法,您的代码仍然可以执行您可以对CheckBox执行的所有操作(设置其值等)。它只是以不干扰视觉风格的方式禁用的用户交互。

答案 1 :(得分:0)

Microsoft在MSDN上提供了一些默认样式,您可以在此处找到复选框的默认样式:http://msdn.microsoft.com/en-us/library/ms752319(v=vs.85).aspx。将此样式复制到项目中,删除Trigger for IsEnabled并将复选框的样式设置为此新样式。

另外,我建议将样式复制到单独的ResourceDictionary中以便重新使用,并防止样式混乱你的xaml文件。

答案 2 :(得分:0)

上面建议的解决方案适用于Windows窗体,但我看到你对WPF的意思和出现的复选标记。

请改为尝试:

namespace System.Windows.Controls
{
    public class UnchangingCheckbox : CheckBox
    {
        public UnchangingCheckbox()
        {
            this.IsReadOnly = true;
        }

        public bool IsReadOnly 
        {
            get { return !this.IsHitTestVisible && !this.Focusable; }
            set 
            { 
                this.IsHitTestVisible = !value; 
                this.Focusable = !value;             
            }
        }
    }
}

您获取了一个名为“IsReadOnly”的属性,默认情况下该属性设置为true,并且具有您需要的行为,而不会出现烦人的“检查标记出现第二个”行为。