2011-07-12 24 views
0

這似乎很簡單,但我似乎無法弄清楚。如何爲一組控件創建懸停效果?

見下面的圖像:

enter image description here

它與在其上的標籤5的面板。

我想要的行爲是,如果鼠標進入框(任何地方),背景顏色會改變(例如:AliceBlue而不是白色)。問題出在Windows窗體中,透明度在其他問題中更爲棘手。如果我在鼠標輸入框中設置面板的背景,標籤全部仍然有白色背景,所以標籤周圍有白色塊。等

我相信其他人已經遇到了這個問題。我相信這很簡單。我無法得到它。

回答

2

BackColor是'環境'屬性。它不能正確工作,因爲你明確地設置了標籤的BackColor。右鍵單擊標籤的BackColor屬性,然後單擊重置,以便不再以粗體顯示。改變面板的BackColor現在也會自動改變標籤的BackColor。

但是,這仍然不能解決您的問題。當您將鼠標移動到其中一個標籤時,面板的MouseLeave事件將會觸發。在Winforms中沒有乾淨的解決方案,訂閱所有標籤並且面板的MouseEnter/Leave事件不能消除角落情況。就像用戶很快從靠近面板邊緣的標籤移動鼠標一樣。您將爲標籤獲取MouseLeave,但不會爲面板提供MouseEnter + Leave。

唯一不錯的解決方法是定時器或Application.Idle事件。像這樣:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     Application.Idle += Application_Idle; 
    } 
    protected override void OnFormClosed(FormClosedEventArgs e) { 
     Application.Idle -= Application_Idle; 
     base.OnFormClosed(e); 
    } 
    void Application_Idle(object sender, EventArgs e) { 
     var pos = panel1.PointToClient(Cursor.Position); 
     if (panel1.DisplayRectangle.Contains(pos)) panel1.BackColor = Color.Red; 
     else panel1.BackColor = this.BackColor; 
    } 
}