Я требую, чтобы курсор формы изменился на курсор 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;
};
Вместо этого обработайте
MouseMove
, получитеNode
из текущего местоположения мыши, выполните итерацию назад, чтобы получитьParent
(и родительский элемент родителя, если он есть) текущегоNode
, и изменитеCursor
соответственно:Также обработайте событие
MouseLeave
, чтобы проверить, нужно ли по умолчанию использоватьCursor
.Или, если вы предпочитаете метод Lambda:
Вот как я считаю, что это должно быть сделано, чтобы включить изменения курсора, когда курсор перемещается в сторону за границы текста узла.
Я думаю, что в этом ответе есть 2 недостатка: 1.
this.treeViewOfAvailableMachines
должно быть((TreeView)sender)
. Когда у вас более одного древовидного представления, могут происходить странные вещи. И 2.MouseLeave
должен быть реализован, как описано в другом ответе. — person hecate; 29.03.2021