我正在设计一个比较对话框(在网格中显示几个具有特征的小部件)。功能部分列出了所有可用功能,每个功能都有一个复选框。如果零件具有该功能,则选中该复选框。这些复选框需要是只读的,所以我isEnabled = false。但在视觉上,复选框(和标签内容)显示为灰色。
以下是一些要点:
我想要的是一种简单的方法来设置/控制复选框(及其内容),使其看起来已启用,但不会对用户输入作出反应。
答案 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,并且具有您需要的行为,而不会出现烦人的“检查标记出现第二个”行为。