我的CheckBox
设置为CheckState.Indeterminate
。当计时器到期时,它将被设置为CheckState.Unchecked
并关闭外部输出信号。到目前为止一切都很好。
使用当前代码,当用户点击Indeterminate CheckBox
时,它将变为Unchecked CheckBox
。我想拦截它并使它成为Checked CheckBox
。
对用户的影响是取消计时器并保持输出打开,直到用户取消选中该框或用户启动一个单独的进程接管并再次设置Indeterminate CheckBox`。
因为它是关闭输出并且必须再次明确地打开它。
我尝试了验证活动,但在我离开此框之前不会发生这种情况。
更新1:澄清一下用户想要看到的内容。 当灯关闭时,盒子总是未经检查。
当系统的自动部分运行时,指示灯亮起。如果用户查看控件,则它处于不确定状态,因为用户没有将其激活,但它已打开。
当过程停止时,计时器启动,灯亮2分钟。在此期间,用户仍然会看到不确定状态。
如果用户需要保持亮起,他将选中删除不确定状态的框。当他通过时,他将手动取消选中关闭灯的框或重新启动自动过程,这将使其再次不确定。
我不知道 AutoCheck 属性
答案 0 :(得分:2)
不需要任何激烈的东西,你只是不喜欢Checkbox实现其AutoCheck属性的方式。因此,选择控件并将其AutoCheck属性设置为False。那就让你以你想要的方式控制检查状态。
添加Click事件处理程序,以允许用户通过鼠标单击或空格键按下将状态从Indeterminate直接翻转为Checked:
{{1}}
答案 1 :(得分:1)
我建议不要改变标准控件的行为,但如果这是你需要的,你可以继承CheckBox并覆盖Onclick方法。
This是您可以看到标准行为的地方。
您需要做的就是在switch语句中重写该逻辑并调用基数。我们需要通过将AutoCheck设置为false来抑制基本的checkstate逻辑,然后将其恢复为之前的值:
public class MyCheckBox : CheckBox
{
protected override void OnClick(EventArgs e)
{
if (AutoCheck)
switch (CheckState)
{
case CheckState.Indeterminate:
CheckState = CheckState.Checked;
break;
case CheckState.Unchecked:
if (ThreeState)
{
CheckState = CheckState.Indeterminate;
}
else
{
CheckState = CheckState.Checked;
}
break;
default:
CheckState = CheckState.Unchecked;
break;
}
var oldAutoCheckValue = AutoCheck;
AutoCheck = false;
base.OnClick(e);
AutoCheck = oldAutoCheckValue;
}
}
作为替代解决方案,您应该考虑使用单选按钮来改善UX。
答案 2 :(得分:0)
我认为你需要CheckStateChanged
事件。
试试这个让我知道:
//mark the process as running (check box is Indeterminate state)
private bool processIsRunning = true;
private void chkState_CheckStateChanged(object sender, EventArgs e)
{
//the user clicks the indeterminate checkbox
if (processIsRunning && chkState.CheckState == CheckState.Unchecked)
{
processIsRunning = false;
chkState.CheckState = CheckState.Checked;
}
}