0

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

以下是一些要点:

  • 复选框是零件是否具有特征的视觉指示器。不需要交互。
  • 要求是一个复选框;我必须说服当权者使用不同的东西。

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

4

3 回答 3

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,并且具有您需要的行为,而没有烦人的“复选标记出现一秒钟”行为。

于 2013-04-02T17:49:19.060 回答
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 项目中的新类中,它们将在工具箱中显示为新工具。然后,您需要做的就是将新的“UnchangedCheckBox”控件拖到您使用 CheckBox 的表单上。您无需在表单上进行任何编码。

使用这种方法,您的代码仍然可以对 CheckBox 执行所有操作(设置其值等)。只有在不影响视觉风格的情况下禁用了用户交互。

于 2013-04-02T14:33:56.637 回答
0

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

附带说明一下,我建议将样式复制到单独的 ResourceDictionary 中以进行重用,并防止样式弄乱您的 xaml 文件。

于 2013-04-02T14:34:42.740 回答