我对 CheckBox 的 OnCheckedChanged 事件有逻辑,该事件在表单加载以及用户更改检查状态时触发。我希望逻辑仅在用户操作时执行。
是否有一种不依赖于设置/检查用户变量的巧妙方法来检测用户与程序更改?
我对 CheckBox 的 OnCheckedChanged 事件有逻辑,该事件在表单加载以及用户更改检查状态时触发。我希望逻辑仅在用户操作时执行。
是否有一种不依赖于设置/检查用户变量的巧妙方法来检测用户与程序更改?
尝试一些好的旧反射?
StackFrame lastCall = new StackFrame(3);
if (lastCall.GetMethod().Name != "OnClick")
{
// Programmatic Code
}
else
{
// User Code
}
调用堆栈是这样的:
所以你需要回到 3 来区分谁 SET Checked
但请记住,有些东西可能会干扰调用堆栈,它不是 100% 可靠的,但您可以稍微扩展一下以搜索原始源。
我的表单上通常有一个 bool 标志,在以编程方式更改值之前将其设置为 true。然后事件处理程序可以检查该标志以查看它是用户还是程序。
我已经尝试过了,它奏效了。
bool user_action = false;
StackTrace stackTrace = new StackTrace();
StackFrame[] stackFrames = stackTrace.GetFrames();
foreach (StackFrame stackFrame in stackFrames)
{
if(stackFrame.GetMethod().Name == "WmMouseDown")
{
user_action = true;
break;
}
}
if (user_action)
{
MessageBox.Show("User");
}
else
{
MessageBox.Show("Code");
}