2015-12-30 43 views
0

我正在尋找模擬自定義工具提示,就像您在使用c#.NET 4.5窗體窗體的網站中看到的一樣。此工具提示基本上會顯示一些任務的狀態,如有多少任務處於待處理狀態,任務正在進行中,已完成等。要做到這一點,我使用無邊界勝利form.This winform將有一些文字,圖像etc.I要它顯示自己的按鈕的mouseHover事件,並在MouseLeave事件消失。我的問題是在Mousehover是越來越生成工具提示形式的事件許多事例和鼠標離開他們沒有得到closed.My代碼c#.net win forms中的自定義工具提示

 private void B_MouseHover(object sender, EventArgs e) 
    { 
     frmSecQStatToolTipDlg tooltip = new frmSecQStatToolTipDlg(); 
     tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom)); 
     tooltip.Show(); 
    } 

private void B_MouseLeave(object sender, EventArgs e) 
    { 
     frmSecQStatToolTipDlg tooltip = new frmSecQStatToolTipDlg(); 
     tooltip.Close(); 
    } 

我的代碼無法正常工作,因此請告訴我如何做到這一點的正確way.Thanks

回答

1

您每次獲得懸停事件時都會生成表單類的新實例,並且每次獲取離開事件時都會生成該表單類的新實例。如果你想繼續使用這種方法,我會建議你在你的主窗體對象上使用一個變量來存儲對你的工具提示窗體的引用。其次,無論何時調用事件處理程序,您都不需要生成新實例,但只有在必要時纔會生成新實例。在第一次爲特定的控件調用Hover事件時,我會創建實例,然後在調用Leave處理程序時將其拋棄 - 這是假設工具提示對話框的構造函數爲每個控制器加載不同的信息過度。像這樣:

frmSecQStatToolTipDlg f_tooltip; 

private void B_MouseHover(object sender, EventArgs e) 
{ 
    if(frmSecQStatToolTipDlg == null) 
    { 
     f_tooltip = new frmSecQStatToolTipDlg(); 
    } 

    tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom)); 
    tooltip.Show(); 
} 

private void B_MouseLeave(object sender, EventArgs e) 
{ 
    if(f_tooltip != null) 
    { 
     f_tooltip.Close(); 
     f_tooltip = null; 
    } 
} 
+0

關閉後無需致電處置。由於表單未以模態方式顯示,因此Dispose將自動調用。如果以模態顯示,則需要Dispose。 – ehh

+1

好點,我會編輯答案將其刪除。 – Adrian

1

您應該爲此表單保留一個全局字段,而不應該是disposeclose它。只需hide它在一些事件和show再次。

示例代碼:

frmSecQStatToolTipDlg tooltip; 

private void B_MouseHover(object sender, EventArgs e) 
{ 
    if(frmSecQStatToolTipDlg == null) 
    { 
     tooltip = new frmSecQStatToolTipDlg(); 
    } 

    tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom)); 
    tooltip.Show(); 
} 

private void B_MouseLeave(object sender, EventArgs e) 
{ 
    if(frmSecQStatToolTipDlg != null) 
    { 
     tooltip.Hide(); 
    } 
} 

有了這個邏輯你不必一次又一次地創造tooltip實例,也不會花時間彈出,如果你經常這樣做的活動。

+0

(frmSecQStatToolTipDlg == NULL): - > frmSecQStatToolTipDlg是一種類型,是不是在給定的情況下 –

+0

這是一個輕微的錯字有效。我相信Shaharyar的意思是'tooltip'代替'frmSecQStatToolTipDlg'。 – Adrian

+0

是的@阿德里安是對的,這是一個錯字錯誤。 – Shaharyar

0

一次作爲只讀聲明你的提示,並使用它,而不要求任何時候,如果它爲空或不是。 如果您需要處置它,實現IDisposable模式: https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx

private readonly frmSecQStatToolTipDlg _tooltip = new frmSecQStatToolTipDlg() ; 

private void B_MouseHover(object sender, EventArgs e) 
{  
    _tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom)); 
    _tooltip.Show(); 
} 

private void B_MouseLeave(object sender, EventArgs e) 
{ 
    _tooltip.Hide(); 
}