我有一个带有可扩展项目列表的树视图。当用户选中父节点的复选框时,我模拟检查子节点。但是,用户可以检查任何节点(不仅仅是父节点)。我想将触发节点复选框事件的用户第一次单击与子节点复选框的模拟检查区分开来。
我想区分用户的点击,以便在树视图更改之前保存它的状态。
我想过使用 mousedown 事件,但这不起作用,因为用户可能会单击以展开某些内容,并且我不想保存树视图的状态,因为没有任何改变。完成这项工作的一种方法是计算每个复选框位置的尺寸,然后检查 mousedown 的点击坐标,但我想避免这样做,因为这并不容易,因为我有嵌套节点,所以复选框有一些他们可能是不同的列。
另一种思考方式是我想将事件组转化为行动。因此,一个动作将代表用户的第一个动作,以及随后的所有模拟动作,直到控制权返回给用户。
另一个想法,也许我可以用窗口聚焦或控制做一些事情。例如,如果窗口在模拟时没有聚焦,如果它发生在用户检查树节点复选框的操作期间,我可以保存焦点更改。
附加信息
模拟的复选框点击由以下代码调用:
e.Node.Checked = false;
这会触发事件: private void tree_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
当用户单击节点时,会触发此 AfterCheck 事件。我想在这里保存树的状态。但是在 AfterCheck 事件内部,也有检查其他节点导致 AfterCheck 事件再次触发 n 次的情况,但这次是模拟了对复选框的检查。
Systems.Windows.Forms.TreeView 在所有情况下都是发送者对象。