2011-03-22 122 views
6

我有一個繼承自Button的MyButton類。在這門課上,我已經放置了其他幾個控件(標籤,Progessbar)。問題在於Button上的控件使得無法觸發Button.Click或Button.MouseHover事件。我如何才能實現按鈕上的控件只顯示「事件透明」:標籤和progessbar上的單擊/懸停與單擊/直接懸停在按鈕上(包括髮件人和所有內容)相同。就像「從父母繼承事件」。C#,容器火災事件

class MyButton : Button 
{ 
    Label foo = new Label(); 
    ProgressBar bar = new ProgessBar(); 
} 
+4

WinForms或WPF? – 2011-03-22 16:46:06

回答

1

具有子控件是真正的控制在按鈕前(無論是在一類從ButtonUserControl繼承)可能使其很難找到特定的按鈕事件工作正常,因爲你已經找到。 (編輯:雖然這很難,但不是不可能的 - 看到漢斯帕桑特的答案)

作爲一種解決辦法,而不是使用子控件,你可以將它們自定義繪製到按鈕表面,因爲你不需要控件的大部分功能(事件,聚焦等),只是它們的顯示。

您可以在班級的OnPaint方法中進行額外的繪畫。喜歡的東西:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    e.Graphics.DrawString("My fake label", Font, 
          SystemBrushes.ControlText, new Point(10, 10)) 
    // draw progressbar 
} 

要更新顯示,則需要使用觸發的Invalidate()按鈕的重繪。

查看Custom Bitmap Button Using C# on CodeProject獲取更完整的示例。

4

您應該派生自UserControl,然後將該按鈕作爲子控件,並在點擊事件時將按鈕子按鈕向上冒泡。

這個link可能比您需要的更多,但這是一個很好的起點。

UPDATE 正如指出的那樣,您可能沒有使用ASP.NET。所以here是另一篇文章,講述了不同的自定義用戶控件,具體來說你以後是Composite Control。這是Windows窗體。

+0

這聽起來像是他不使用asp.net(基於他的示例代碼中存在ProgressBar) – 2011-03-22 16:45:45

+0

好點,我的錯誤假設。我會找到一個適用於winforms(或WPF?)的示例 – CodingGorilla 2011-03-22 16:48:41

0

這個答案在這裏剛纔,但刪除了:

你能從UserControl而不是繼承?這將允許您在控制界面上放置其他控件,包括您的按鈕並訂閱他們的活動。

0

如果你使用的是WPF,我猜你在找什麼叫做Bubbled Events。這是WPF中的一個功能,通過這個功能,從控件向其父級冒泡(在您的情況下,它將從您的ProgressBar和Label到您的按鈕)。我發現this article on the matter,我認爲這對你有幫助。

希望這有助於:)

3

寫Click事件處理程序的標籤和PB,可以打電話PerformClick()。

使控件對鼠標透明是可能的,但很難做到。你必須重寫WndProc()來捕獲WM_NCHITTEST並返回HTTRANSPARENT。全面的更好的解決方案是不使用控件。標籤僅僅是按鈕的Paint事件中的TextRenderer.DrawText()。 ProgressBar也不難,e.Graphics.FillRectangle()。