2015-10-29 5 views
1

Я хочу показать специальное всплывающее управление, когда пользовательская мышь hovers узла и скрыть его, когда мышь покидает узел.Как реализовать аналоговое событие NodeMouseOut для TreeView?

У нас есть NodeMouseHover событие для первой части, но что делать со скрытой процедурой?

+1

Вам нужен таймер. Убедитесь, что вы находитесь над элементом управления, и если да, то какой узел. – LarsTech

+0

Спасибо. Даже когда это обходное решение - оно все равно будет работать, поэтому сделайте это как ответ. Я соглашусь, если не появится лучший ответ. – Kosmos

ответ

1

Таймер может быть использован для проверки положения мыши:

public class TreeViewEx : TreeView { 
    public event TreeViewEventHandler NodeMouseLeave; 

    private System.Windows.Forms.Timer timer; 
    private TreeNode mouseNode = null; 

    public TreeViewEx() { 
    if (System.ComponentModel.LicenseManager.UsageMode == LicenseUsageMode.Runtime) { 
     timer = new System.Windows.Forms.Timer(); 
     timer.Tick += timer_Tick; 
     timer.Enabled = true; 
    } 
    } 

    protected void OnNoseMouseLeave(TreeViewEventArgs e) { 
    if (this.NodeMouseLeave != null) { 
     this.NodeMouseLeave(this, e); 
    } 
    } 

    void timer_Tick(object sender, EventArgs e) { 
    if (this.ClientRectangle.Contains(this.PointToClient(MousePosition))) { 
     TreeNode testNode = this.GetNodeAt(this.PointToClient(MousePosition)); 

     if (testNode == null) { 
     if (mouseNode != null) { 
      OnNoseMouseLeave(new TreeViewEventArgs(mouseNode)); 
      mouseNode = null; 
     } 
     } else { 
     if (mouseNode != null && !testNode.Equals(mouseNode)) { 
      OnNoseMouseLeave(new TreeViewEventArgs(mouseNode)); 
     } 
     mouseNode = testNode; 
     } 
    } else { 
     if (mouseNode != null) { 
     OnNoseMouseLeave(new TreeViewEventArgs(mouseNode)); 
     mouseNode = null; 
     } 
    } 
    } 
}