C# 只要树节点悬停,就显示树节点工具提示
当myC# 只要树节点悬停,就显示树节点工具提示,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
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);
}