【问题标题】:Positioning Balloon ToolTips over TreeNodes在 TreeNode 上定位气球工具提示
【发布时间】:2012-04-06 12:16:19
【问题描述】:

我想在TreeView 节点上添加一个ToolTip 并在鼠标坐标处出现一个气球:

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 上方并延迟其显示?

【问题讨论】:

    标签: c# winforms treeview tooltip


    【解决方案1】:

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

    最后,如果鼠标离开TreeView,我们不想显示ToolTip

    private void treeView_MouseLeave(object sender, EventArgs e)
    {
        timer.Stop();
        toolTip.Hide(this);
    }
    

    【讨论】:

    • 效果很好,我还有一个问题是有没有机会自定义这个工具提示的外观(像气球一样)。感谢您的回答。
    • 我最初的回答只有在需要标准工具提示时才有用。我添加并测试了一个解决方案,它创建气球工具提示,以适当的方式延迟它们并将它们显示在相对于相关TreeNode 的方便位置。
    • 查看ToolTip 的属性。您可以更改其颜色、更改字体、设置标题和图标等等。如果您将属性OwnerDraw 设置为true,您可以在ToolTip.Draw 事件处理程序中自己绘制ToolTip(仅适用于IsBalloon == false)。
    【解决方案2】:

    我认为你需要使用:

    toolTip1.Show("text", treeView1, point);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多