C# 在 TreeNode 悬停时显示 TreeNode ToolTip

C# Show TreeNode ToolTip as long as TreeNode is hovered

当我的 TreeView 中的 TreeNode 悬停时,应该会显示 ToolTip。当鼠标离开 TreeNode 时,ToolTip 应该消失。我尝试通过获取 PontToClient()MousePositionToolTipShow() 来做到这一点,只要 MousePosition 没有改变。它有效,但看起来不太好。 ToolTip 鼠标稍微移动一下就会消失或不显示。

这给出了一些工作结果

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,只要 MousePosition 处的 TreeNode 与触发事件的 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();
}

更新

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

treeView.GetNodeAt(MousePosition).Name

Object reference not set to an instance of an object

treeView.GetNodeAt(MousePosition)returnsnull,因此您无法从中访问属性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 声明移出方法并将其放入窗体的范围内,然后在悬停时显示 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);
}