只要TreeNode悬停,C#就会显示TreeNode ToolTip

时间:2017-01-23 11:21:08

标签: c# while-loop tooltip treenode mouse-position

TreeNode中的TreeView悬停时,应显示ToolTip。当鼠标离开TreeNode时,ToolTip应该消失。我尝试通过获取MousePosition的{​​{1}}和PontToClient() Show(),只要ToolTip没有改变。它有效,但看起来不太好。 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(); } 的{​​{1}}与触发事件的ToolTip相同,我就会尝试显示TreeNode。但现在MousePosition从未显示过?

TreeNode

更新

我刚才意识到这个结果会出现以下异常?

ToolTip
  

对象引用未设置为对象的实例

1 个答案:

答案 0 :(得分:1)

String Availability = json.getString("Availability");before parsing value ="4" int x = Integer.parseInt(Availability);here after parsing it gives me 2 i don't know why 会返回treeView.GetNodeAt(MousePosition),因此您无法从中访问属性null

Name是鼠标指针在屏幕上的位置,而不是您的控件。所以,让我们假设您的指针位于屏幕中间,因此坐标将类似于x:1000,y:500。但是,MousePosition需要树视图中的坐标,其中,例如,第一个节点位于x:20和Y:50坐标。

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

GetNodeAt()

<强>更新 在第二个示例中,正确使用将是:

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

但是,为了简化事情(并避免闪烁,工具提示的不断初始化等),我会将ToolTip声明移出方法并将其放入表单的范围,然后在悬停时显示ToolTip并在鼠标移动时隐藏它。 像这样:

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