我有一个设置为CheckBox的CheckState.Indeterminate。当计时器过期时,它将被设置为CheckState.Unchecked并关闭外部输出信号。到目前一切尚好。
使用当前代码,当用户单击Indeterminate CheckBox时,它将成为一个Unchecked CheckBox。我想拦截它并使它成为Checked CheckBox。
用户的效果将是取消计时器并保持输出打开,直到用户取消复选框,或者用户启动一个独立的进程来接管并再次设置不确定的CheckBox` `。
实际上,他关闭了输出,必须再次显式地打开它。
我尝试了验证事件,但直到我离开盒子才会发生这种情况。
更新1:以澄清用户希望看到的内容。当灯关灯时,盒子总是不加检查。
当系统的自动部分运行时,灯就亮了。如果用户查看控件,它处于不确定状态,因为用户没有激活它,但它是打开的。
当进程停止时,一个计时器就会启动,让灯亮2分钟。在此期间,用户仍然会看到不确定的状态。
如果用户需要保持亮着,他将选中复选框,删除不确定状态。当他通过时,他将手动取消复选框,关闭灯或重新启动自动过程,这将使它再次不确定。
我不知道AutoCheck属性
发布于 2016-10-30 09:59:33
没有必要采取任何激烈的措施,您只是不喜欢复选框实现其AutoCheck属性的方式。因此,选择该控件并将其AutoCheck属性设置为False。让我们以你想要的方式控制支票状态。
添加Click事件处理程序,允许用户将状态从不确定状态直接翻转到用鼠标单击或空格键按下检查:
private void checkBox1_Click(object sender, EventArgs e) {
checkBox1.CheckState = checkBox1.CheckState == CheckState.Checked ?
CheckState.Unchecked : CheckState.Checked;
}发布于 2016-10-29 21:50:42
我建议不要更改标准控件的行为,但是如果这是您所需要的,您可以子类CheckBox并重写Onclick方法。
这是您可以看到标准行为的地方。
您所需要做的就是重新处理开关语句中的逻辑并调用基。我们需要通过将AutoCheck设置为false来抑制基的校验状态逻辑,然后将其恢复到以前的值:
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。
发布于 2016-10-29 21:48:59
我想你需要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;
}
}https://stackoverflow.com/questions/40323634
复制相似问题