在TreeNodes上定位气球工具提示

时间:2012-04-06 12:16:20

标签: c# winforms treeview tooltip

我想将ToolTip添加到TreeView个节点,并在鼠标坐标处显示一个气球:

private void treeView1_MouseMove(object sender, MouseEventArgs e)
{
    node = treeView1.getNodeAt(e.X, e.Y);
    toolTip1 = new ToolTip();
    toolTip1.IsBalloon = true;
    toolTip1.InitialDelay = 500;
    toolTip1.SetToolTip(treeView1, node.Text);
}

问题在于ToolTip已分配给TreeView,而不是TreeNode,并且气球的位置非常奇怪 - 不是在预期的鼠标坐标处,而是treeView1中的某个地方。

我尝试使用toolTip1.Show()但忽略了InitialDelay属性。

如何将气球ToolTip放在TreeNode上并延迟显示?

2 个答案:

答案 0 :(得分:5)

为了显示ToolTip的工具提示,无需TreeNodes控件。 TreeView有一个属性ShowNodeToolTips,您可以将其设置为trueTreeNodes具有ToolTipText属性。


但是,如果要将ToolTip显示为气球,事情会变得更复杂。幸运的是,TreeView发生了NodeMouseHover事件。与Timer一起,我们可以使ToolTip按预期行事。

在我们的表单中,我们创建这些声明并设置计时器事件处理程序

private const int InitialToolTipDelay = 500, MaxToolTipDisplayTime = 2000;

private ToolTip toolTip = new ToolTip();
private Timer timer = new Timer();
private TreeNode toolTipNode;

public frmTreeViewWithToolTip()
{
    InitializeComponent();
    toolTip.IsBalloon = true;
    timer.Tick += new EventHandler(timer_Tick);
}

NodeMouseHover我们启动流程

private void treeView_NodeMouseHover(object sender,
                                     TreeNodeMouseHoverEventArgs e)
{
    timer.Stop();
    toolTip.Hide(this);

    toolTipNode = e.Node;

    timer.Interval = InitialToolTipDelay;
    timer.Start();
}

计时器将启动两次:一次用于初始延迟,一次用于气球的最大显示时间。因此,我们必须在timer.Tick事件处理程序

中处理这两种情况
void timer_Tick(object sender, EventArgs e)
{
    timer.Stop();
    if (timer.Interval == InitialToolTipDelay) { 
        Point mousePos = treeView.PointToClient(MousePosition);

        // Show the ToolTip if the mouse is still over the same node.
        if (toolTipNode.Bounds.Contains(mousePos)) {
             // Node location in treeView coordinates.
            Point loc = toolTipNode.Bounds.Location;

             // Node location in form client coordinates.
            loc.Offset(treeView.Location);

            // Make balloon point to upper right corner of the node.
            loc.Offset(toolTipNode.Bounds.Width - 7, -12);

            toolTip.Show("Node: " + toolTipNode.Text, this, loc);

            timer.Interval = MaxToolTipDisplayTime;
            timer.Start();
        }
    } else {
        // Maximium ToolTip display time exceeded.
        toolTip.Hide(this);
    }
}

最后,如果鼠标离开ToolTip

,我们不希望显示TreeView
private void treeView_MouseLeave(object sender, EventArgs e)
{
    timer.Stop();
    toolTip.Hide(this);
}

答案 1 :(得分:0)

我认为您需要使用:

toolTip1.Show(“text”,treeView1,point);