C# 在 TreeNode 悬停时显示 TreeNode ToolTip
C# Show TreeNode ToolTip as long as TreeNode is hovered
当我的 TreeView
中的 TreeNode
悬停时,应该会显示 ToolTip
。当鼠标离开 TreeNode
时,ToolTip
应该消失。我尝试通过获取 PontToClient()
的 MousePosition
和 ToolTip
的 Show()
来做到这一点,只要 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);
}
当我的 TreeView
中的 TreeNode
悬停时,应该会显示 ToolTip
。当鼠标离开 TreeNode
时,ToolTip
应该消失。我尝试通过获取 PontToClient()
的 MousePosition
和 ToolTip
的 Show()
来做到这一点,只要 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);
}