TreeView игнорировать двойной щелчок только при флажке

У меня есть treeview с флажком, я пытаюсь отключить двойной щелчок, только когда это делается в флажке.

Я нашел способ полностью отключить двойной щелчок, но это было не то, что я хотел.

Я ценю, если вы можете мне помочь.

Ответы

Ответ 1

Если вы просто хотите узнать о событии DoubleClick из CheckBox:

private void TreeViewDoubleClick(object sender, EventArgs e)
{
    var localPosition = treeView.PointToClient(Cursor.Position);
    var hitTestInfo = treeView.HitTest(localPosition);
    if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage) 
        return;

    // ... Do whatever other processing you want
}

Ответ 2

Я нашел этот вопрос, когда искал ту же ошибку. Проблема с решением NoodleFolk заключается в том, что он отключает расширение трех, дважды щелкнув элемент. Объединив ответ NoodleFolk с ответом john arlens, вы получите что-то вроде этого:

class NewTreeView : TreeView
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x203) // identified double click
        {
            var localPos = PointToClient(Cursor.Position);
            var hitTestInfo = HitTest(localPos);
            if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage)
                m.Result = IntPtr.Zero;
            else
                base.WndProc(ref m);
        }
        else base.WndProc(ref m);
    }
}

Я (быстро) протестировал это решение и, похоже, работает.

Ответ 3

Вариант 1: полностью отключить событие двойного щелчка.
Создание контроля клиента

class MyTreeView : TreeView
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0203)
        {
            m.Result = IntPtr.Zero;
        }
        else
        {
            base.WndProc(ref m);
        }
    }
}

и в файле вашего конструктора (form.Designer.cs), найдите, где был создан элемент управления, и замените вызов конструктора TreeView новым элементом управления.

this.treeView1 = new MyTreeView();

Вариант 2. Обработайте событие двойного щелчка в виде двух событий с одним кликом.

class MyTreeView : TreeView
{
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0203)
        {
            m.Msg = 0x0201;
        }
        base.WndProc(ref m);
    }
}

Лично я думаю, что вариант 2 более интуитивно понятен. Когда пользователь дважды нажимает флажок, флажок не установлен.

Ответ 4

Объединив приведенные выше ответы, я нашел, что это лучшее решение для меня. Двойной щелчок на node для расширения его дочерних объектов по-прежнему работает, только двойной щелчок на флажке затронут и исправлен:

class MyTreeView : TreeView
{
    protected override void WndProc(ref Message m)
    {
      if (m.Msg == 0x0203 && this.CheckBoxes)
      {
        var localPos = this.PointToClient(Cursor.Position);
        var hitTestInfo = this.HitTest(localPos);
        if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage)
        {
          m.Msg = 0x0201;
        }
      }
      base.WndProc(ref m);
    }
}