2017-01-23 23 views
0

Когда заводится TreeNode в моем TreeView, должен отображаться ToolTip. И когда мышь оставит TreeNode, ToolTip должен исчезнуть. Я попытался сделать это, получив MousePosition от PontToClient() и Show()ToolTip до тех пор, пока MousePosition не изменился. Он работает, но выглядит не очень хорошо. ToolTip исчезает или не отображается, если мышь перемещается только малейшим образом.C# Показывать TreeNode ToolTip до тех пор, пока TreeNode не зависнет

Это дало несколько рабочий результат

private void treeView_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e) 
{ 
    ToolTip tip = new ToolTip(); 
    tip.ToolTipTitle = e.Node.Name; 
    Point client = PointToClient(MousePosition); 
    while (client == PointToClient(MousePosition)) 
    { 
     tip.Show(e.Node.Nodes.Count.ToString(), this, PointToClient(MousePosition)); 
    } 
    tip.Dispose(); 
} 

Вместо этого я пытаюсь показать ToolTip до тех пор, как TreeNode на MousePosition такая же, как TreeNode, вызвавшего событие. Но теперь ToolTip никогда не показывает?

private void treeView_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e) 
{ 
    ToolTip tip = new ToolTip(); 
    tip.ToolTipTitle = e.Node.Name; 
    while (e.Node == treeView.GetNodeAt(MousePosition)) 
    { 
     tip.Show(e.Node.Nodes.Count.ToString(), this, PointToClient(MousePosition)); 
    } 
    tip.Dispose(); 
} 

UPDATE

Я просто понял, что этот результат в следующем исключение?

treeView.GetNodeAt(MousePosition).Name 

Ссылка на объект не указывает на экземпляр объекта

ответ

1

treeView.GetNodeAt(MousePosition) возвращает null, так что вы не можете получить доступ к собственности Name от него.

MousePosition - указатель мыши на вашем экране, а не на вашем контроле. Итак, давайте предположим, что ваш указатель находится в середине экрана, поэтому координаты будут похожи на x: 1000, y: 500. Но GetNodeAt() ожидает координаты в treeview, где, например, первый узел находится в x: 20 и Y: 50 координаты.

Вы должны преобразовать эти координаты, чтобы быть относительно вашего TreeView, что-то вроде этого:

var point = treeView.PointToClient(MousePosition); 
var node = treeView.GetNodeAt(point); 

UPDATE: В вашем втором примере, правильное использование будет:

private void treeView1_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e) 
{ 
    ToolTip tip = new ToolTip(); 
    tip.ToolTipTitle = e.Node.Name; 
    while (e.Node == treeView.GetNodeAt(treeView.PointToClient(MousePosition))) 
    { 
     tip.Show(e.Node.Nodes.Count.ToString(), this, PointToClient(MousePosition)); 
    } 
    tip.Dispose(); 
} 

но, чтобы упростить вещи (и избегать мерцания, постоянной инициализации всплывающей подсказки и т. д.), я перенес бы декларацию ToolTip из метода и поместил бы ее в область формы, а затем покажу подсказку при наведении и скрыть его при перемещении мыши. НЕТ:

ToolTip tip = new ToolTip(); 

private void treeView_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e) 
{ 

    tip.ToolTipTitle = e.Node.Name; 
    tip.Show(e.Node.Nodes.Count.ToString(), this, PointToClient(MousePosition)); 

} 

private void treeView_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (treeView.GetNodeAt(treeView.PointToClient(MousePosition)) == null) 
     tip.Hide(this); 
}