Насколько я знаю, простого способа добиться этого не существует. Можно подумать, что в событии 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;
}
Я говорю «довольно хорошо», потому что я чувствую, что в некоторых случаях он не позволяет расширяться узлу, когда этого делать не следует (например, если вы в течение времени двойного щелчка нажимаете сначала на текст узла, а затем на знак плюс). Это можно было бы решить каким-то образом, или, возможно, вы можете жить с этим.