TreeView(带复选框)未正确处理单击

本文关键字:正确处理 单击 复选框 TreeView | 更新日期: 2023-09-27 18:20:24

我有一个TreeList,它基本上就像Photoshop图层调色板。这是一个带有复选框的分层列表,用于切换文档各个层的可见性。这是通过BeforeChecked事件完成的,该事件在.Checked值切换之前引发。

它工作得很好,除非你双击它,在这一点上,一切似乎都失控了。

如果双击复选框一次,它会切换两次选中的值(这是预期的行为),但不会切换两次层的可见性,因为它不会提升BeforeChecked两次。

我想我可以通过把这个放在鼠标双击事件中来解决这个问题:

TreeViewHitTestInfo hit = treeLayerPalette.HitTest(e.X, e.Y);
hit.Node.Checked = !(hit.Node.Checked);

这适用于除第一次外的所有双击。因此,它一开始只引发BeforeChecked事件一次(而不是MouseDoubleClick),使复选框与层的可见性不同步,然后所有随后的双击都会引发BeforeCheck和MouseDouble Click事件(这反过来又会引发BeforeChecked事件),从而保持不正确的关系。

此外,有一次,我在DoubleClick事件中放入了MessageBox.Show()。令人尴尬的是,它实际上并没有在双击时显示,而是在第三次点击时显示,无论实际双击和第三次单击之间经过了多少时间。双击20秒后执行的第三次单击将引发MouseDoubleClick事件,但实际的双击不会。

这里到底发生了什么,我该怎么解决?

TreeView(带复选框)未正确处理单击

这是启用复选框的树视图的一个问题,但也有一些可接受的解决方案。。首先:MS知道问题,但拒绝解决…:http://connect.microsoft.com/VisualStudio/feedback/details/775922/treeview-double-click-bug#details<--Bug报告。。。。

所以没有办法,只能解决它。最简单的方法是将Treeview子类化,并强制禁用复选框上的dblclick。。。答案(在SOF上):c#treeview忽略双击复选框

希望这能有所帮助。。。。