2017-01-23 95 views
0

當我的TreeView中的TreeNode被徘徊時,ToolTip應該顯示。而當鼠標離開TreeNodeToolTip應該消失。我試圖通過獲得MousePositionPontToClient()Show()ToolTip,只要MousePosition沒有改變。它有效,但看起來不太好。 ToolTip消失或不顯示,如果鼠標移動一絲絲。只要樹節點懸停,C#顯示TreeNode 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只要TreeNodeMousePosition是相同觸發事件的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(); 
} 

UPDATE

我剛剛意識到,這個結果在下面的異常?

treeView.GetNodeAt(MousePosition).Name 

對象引用不設置到對象

回答

1

treeView.GetNodeAt(MousePosition)回報null的一個實例,所以你不能從它訪問屬性Name

MousePosition是鼠標指針在屏幕上的位置,而不是您的控件。所以,讓我們假設你的指針在屏幕中間,所以座標就像x:1000,y:500.但是,GetNodeAt()預計座標在樹視圖中,例如,第一個節點在x:20和Y:50座標。

你必須改變這些座標是相對於你的TreeView,這樣的事情:

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

UPDATE: 在第二個例子中,正確的使用是:

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