C# 只要树节点悬停,就显示树节点工具提示

C# 只要树节点悬停,就显示树节点工具提示,c#,while-loop,tooltip,treenode,mouse-position,C#,While Loop,Tooltip,Treenode,Mouse Position,当myTreeView中的TreeNode悬停时,将显示工具提示。当鼠标离开树节点时,工具提示应该消失。我尝试通过获取PontoClient()的MousePosition和Show()工具提示来实现这一点,只要MousePosition没有改变。它能用,但看起来不太好。工具提示消失或不显示鼠标是否有轻微移动 这在某种程度上产生了工作效果 private void treeView_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs

当my
TreeView
中的
TreeNode
悬停时,将显示
工具提示。当鼠标离开
树节点时,
工具提示应该消失。我尝试通过获取
PontoClient()
MousePosition
Show()
工具提示来实现这一点,只要
MousePosition
没有改变。它能用,但看起来不太好。
工具提示
消失或不显示鼠标是否有轻微移动

这在某种程度上产生了工作效果

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();
}
相反,我试图显示
工具提示
,只要
鼠标位置的
树节点
与触发事件的
树节点
相同。但是现在
工具提示从来没有显示过

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();
}
更新

我刚刚意识到,这会导致以下异常

treeView.GetNodeAt(MousePosition).Name
对象引用未设置为对象的实例

treeView.GetNodeAt(MousePosition)
返回
null
,因此您无法从中访问属性
Name

MousePosition
是鼠标指针在屏幕上的位置,而不是在控件上。所以,让我们假设你的指针在屏幕中间,所以坐标会像x:1000,y:500。但是,
GetNodeAt()
需要树视图中的坐标,例如,第一个节点位于x:20和Y:50坐标处

您必须将这些坐标转换为相对于树视图的坐标,如下所示:

var point = treeView.PointToClient(MousePosition);
var node = treeView.GetNodeAt(point);
更新: 在第二个示例中,正确的用法是:

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