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

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

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

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

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

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

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;
};

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

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

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;
     }
};
0 голосов
/ 20 февраля 2020

Вместо этого обработайте 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;
}

Или если вы предпочитаете лямбда-путь:

//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;
};
...