2016-02-09 30 views
2

我正在製作Windows窗體,我有麻煩讓鼠標懸停事件以我想要的方式工作。我在一個大組裏面有50個小組拼在一起。我想在用戶懸停在一個小面板上時彈出信息。C#鼠標懸停事件爲背景面板

與其爲每個小面板製作鼠標懸停事件,我只想爲大面板製作一個鼠標懸停事件。每當用戶將鼠標懸停在大面板內的任何位置時,我的代碼將確定它們是否在一個小面板內部懸停,如果是,它將識別小面板並顯示相關信息。

但是,我發現如果我將鼠標懸停在一個小面板上,它不會觸發大面板鼠標懸停事件,因爲它技術上在小面板邊界和大面板邊界之外(有點像萊索托是如何即使它位於南非境內)。

有沒有解決這個問題的方法?

enter image description here

+4

您可以嘗試爲所有面板分配相同的事件處理函數,並且將發送方'(object sender,EventArgs e)'轉換爲確定哪個面板觸發事件 –

+1

確實,當鼠標懸停在某個面板上時,大面板不會觸發小一個。該表單也不會收到鼠標事件。 - 當您動態創建它們時,創建(one!)事件以及面板,正如我希望的那樣! – TaW

回答

1

我結束了什麼S. Brentson建議去。我在我的Form.cs文件中創建了自己的自定義事件處理程序GridMouseHover

private void GridMouseHover(object sender, EventArgs e) 
    { 

    } 

我然後我事件時所連接的MouseHover事件我的每一個控制的,以我的新GridMouseHover事件,以便將他們全部鏈接之前MouseHover事件有可能引發。

private void Form4_Load(object sender, EventArgs e) 
    { 
     this.panel1.MouseHover += GridMouseHover; 
     this.panel2.MouseHover += GridMouseHover; 
     this.panel3.MouseHover += GridMouseHover; 
     //etc... 
    } 

我的手在我的Form.cs[Design]窗口這就是爲什麼我沒有嘗試TAW的建議已經創建的所有我的面板,但我會因爲把一切都用手工很乏味的下一次一定要試試。謝謝您的幫助!

+0

當您接下來發現自己正在設計這種表單時,在運行時添加面板就值得您一試。這很容易,你可以在5分鐘內完成代碼的編寫工作,而不需要花費很長時間在設計器中完成。 – Enigmativity

+0

您將來可能會考慮的其他事情是創建一個用戶控件,其中包含面板中的所有標籤和內容。在用戶控件的代碼中,您可以將必要的信息傳遞給它並在那裏處理鼠標。從那裏開始,您只需將控件拖放到表單上,而無需分配事件處理程序。 –

1

試試這個在您的單一事件如希望這將幫助你

private void Panaal_MouseMove(object sender, MouseEventArgs e) 
{ 
    Control ctr = sender as Control; 
    if (ctr.Name.Equals("Panel Name")) 
    { 
    //your POP Up code 
    } 
} 
2

乾淨的解決方案將實現自己的LittlePanel控制:

public class LittlePanel : Panel 
{ 
    public class HoverEventArgs 
    { 
     public bool Active { get; set; } 

     public HoverEventArgs(bool active) 
     { 
      Active = active; 
     } 
    } 

    public event EventHandler<HoverEventArgs> Hover; 

    protected override void OnMouseEnter(EventArgs e) 
    { 
     base.OnMouseEnter(e); 
     OnHover(true); 
    } 

    protected override void OnMouseLeave(EventArgs e) 
    { 
     base.OnMouseLeave(e); 
     OnHover(false); 
    } 

    protected void OnHover(bool active) 
    { 
     EventHandler<HoverEventArgs> hover = Hover; 
     if (hover != null) hover(this, new HoverEventArgs(active)); 
    } 
} 

然後訂閱所有提出的Hover事件LittlePanels內的「大」Panel

foreach (Control control in bigPanel.Controls) 
{ 
    if (control is LittlePanel) 
    { 
     ((LittlePanel)control).Hover += littlePanel_Hover; 
    } 
} 

使用一個共享的事件處理程序:

void littlePanel_Hover(object sender, LittlePanel.HoverEventArgs e) 
{ 
    // Your code goes here... 
} 

您也可以考慮添加共享功能的LittlePanel控制,如包含標籤,