Отображение другого курсора, когда пользователь наводит указатель мыши на конкретный элемент управления TreeNode элемента управления TreeView

Я требую, чтобы курсор формы изменился на курсор Cursors.Hand, когда пользователь наводит указатель на узел со специально названным родительским узлом.

Проблема, с которой я столкнулся при реализации этого, связана с изменением курсора обратно на значение по умолчанию, когда пользователь перемещает указатель от рассматриваемого TreeNode.

Я обработал событие NodeMouseHover элемента управления TreeView (как в фрагменте кода в конце), чтобы изменить указатель на альтернативный курсор и вернуться к курсору по умолчанию, когда указатель перемещается на другой узел, но это не обрабатывает случай когда пользователь перемещает указатель от узлов к, скажем, пустой области элемента управления TreeView.

Моя первоначальная и единственная интуиция относительно решения этой проблемы заключалась в том, чтобы получить местоположение и вычислить площадь TreeNode, которые требуют изменения курсора, и проверить, находится ли указатель по-прежнему на одном из них в обработчике события MouseMove. элемента управления TreeView, но я считаю, что это не изящное решение, так как существует множество TreeNode, которые требуют такого поведения, которое потребовало бы циклического перебора многих из них для проверки, что, в свою очередь, может привести к тому, что приложение окажется в редкие сценарии, немного не реагирует.

Заранее спасибо.

PS Рассматриваемый фрагмент кода:

this.treeView.NodeMouseHover += delegate (object sender, TreeNodeMouseHoverEventArgs e)
{
   bool isNewCursorAssigned = false;
   if (e.Node.Parent != null)
   {
      if (e.Node.Parent.Text == "someTxt")
      {
         this.Cursor = Cursors.Hand;
         isNewCursorAssigned = true;
      }
   }
   if (isNewCursorAssigned == false && this.Cursor != this.DefaultCursor)
      this.Cursor = this.DefaultCursor;
};

См. также:  Как правильно выполнить приведение для сравнения указателя с явным диапазоном адресов?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. hecate

    Вместо этого обработайте MouseMove, получите Node из текущего местоположения мыши, выполните итерацию назад, чтобы получить Parent (и родительский элемент родителя, если он есть) текущего Node, и измените Cursor соответственно:

    private void treeView1_MouseMove(object sender, MouseEventArgs e)
    {
        var node = treeView1.GetNodeAt(e.Location);
    
        if (node != null)
        {
            var parent = node.Parent;
    
            while (parent != null)
            {
                if (parent.Text == "someTxt")
                {
                    if (Cursor != Cursors.Hand)
                                Cursor = Cursors.Hand;
                            return;
                }
                parent = parent.Parent;
            }
            Cursor = Cursors.Default;
        }
    }
    

    Также обработайте событие MouseLeave, чтобы проверить, нужно ли по умолчанию использовать Cursor.

    private void treeView1_MouseLeave(object sender, EventArgs e)
    {
        if (Cursor != Cursors.Default)
            Cursor = Cursors.Default;
    }
    

    Или, если вы предпочитаете метод Lambda:

    //In the constructor:
    
    treeView1.MouseMove += (s, e) =>
    {
        var node = treeView1.GetNodeAt(e.Location);
    
        if (node != null)
        {
            var parent = node.Parent;
            while (parent != null)
            {
                if (parent.Text == "someTxt")
                {
                    if (Cursor != Cursors.Hand)
                        Cursor = Cursors.Hand;
                    return;
                }
                parent = parent.Parent;
            }
            Cursor = Cursors.Default;
        }
    };
    
    treeView1.MouseLeave += (s, e) =>
    {
        if (Cursor != Cursors.Default)
            Cursor = Cursors.Default;
    };
    
  2. hecate

    Вот как я считаю, что это должно быть сделано, чтобы включить изменения курсора, когда курсор перемещается в сторону за границы текста узла.

    this.treeView.MouseMove += delegate (object sender, MouseEventArgs e)
    {
         TreeNode concernedNode = this.treeViewOfAvailableMachines.GetNodeAt(e.Location);
         if (concernedNode != null)
            if (!(concernedNode.Parent != null && concernedNode.Parent.Text == "someTxt"))
                   concernedNode = null;
         if (concernedNode != null)
         {
              if ((e.Location.X >= concernedNode.Bounds.Location.X &&
                        e.Location.X <= concernedNode.Bounds.Location.X + concernedNode.Bounds.Width) &&
                        (e.Location.Y >= concernedNode.Bounds.Location.Y &&
                        e.Location.Y <= concernedNode.Bounds.Location.Y + concernedNode.Bounds.Height))
              {
                   this.Cursor = Cursors.Hand;
              }
              else
              {
                   this.Cursor = this.DefaultCursor;
              }
         }
         else
         {
              this.Cursor = this.DefaultCursor;
         }
    };
    

    Я думаю, что в этом ответе есть 2 недостатка: 1. this.treeViewOfAvailableMachines должно быть ((TreeView)sender). Когда у вас более одного древовидного представления, могут происходить странные вещи. И 2. MouseLeave должен быть реализован, как описано в другом ответе. person hecate; 29.03.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: