小智 22
private bool isDoubleClick = false;
private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e)
{
if (isDoubleClick && e.Action == TreeViewAction.Collapse)
e.Cancel = true;
}
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
if (isDoubleClick && e.Action == TreeViewAction.Expand)
e.Cancel = true;
}
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
isDoubleClick = e.Clicks > 1;
}
Run Code Online (Sandbox Code Playgroud)
您可以声明私有字段isDoubleClick并如上所述设置各种TreeView事件.这将阻止双击展开/折叠TreeView节点.但是,展开/折叠将通过+和 - 图标起作用.
Fre*_*örk 14
据我所知,没有简单的方法可以实现这一目标.一种想法是在DoubleClick事件上bool设置变量true,并使用事件的e.Cancel属性BeforeExpand来阻止节点扩展.但是,这两个事件是以相反的顺序触发的,因此这不是解决方案.我没有另外一个解决方案; 如果我拿出一个会更新.
更新
我已经玩了一下这个,我找到了一种工作得相当好的方法.正如我所提到的问题是BeforeExpand发生之前 DoubleClick,所以我们不能设置任何状态下DoubleClick才能使用BeforeExpand.
但是,我们可以通过另一种方式检测(潜在)双击:通过测量MouseDown事件之间的时间.如果我们MouseDown在定义双击的时间段内得到两个事件(如中所述SystemInformation.DoubleClickTime),则应该是双击,对吧?此MouseDown事件之前已经提出BeforeExpand.因此,以下代码运行良好:
private bool _preventExpand = false;
private DateTime _lastMouseDown = DateTime.Now;
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
e.Cancel = _preventExpand;
_preventExpand = false;
}
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
int delta = (int)DateTime.Now.Subtract(_lastMouseDown).TotalMilliseconds;
_preventExpand = (delta < SystemInformation.DoubleClickTime);
_lastMouseDown = DateTime.Now;
}
Run Code Online (Sandbox Code Playgroud)
我说"相当不错",因为我觉得它阻止节点在某些情况下不应该扩展(例如,如果你在双击时间内首先单击节点文本然后单击加号).这可能有可能以某种方式解决,或者也许你可以忍受.
MouseDown 事件将在 BeforeExpand/BeforeCollapse 事件之前发生。您可以检查 MouseEventArg 的 Clicks 属性来区分双击和单击:
bool dblClick;
private void treeView_MouseDown(object sender, MouseEventArgs e)
{
dblClick = e.Button == MouseButtons.Left && e.Clicks == 2;
}
private void treeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
if (e.Action == TreeViewAction.Expand) e.Cancel = dblClick;
}
Run Code Online (Sandbox Code Playgroud)