2011-03-22 18 views
6

Tengo una clase MyButton que hereda de Button. En esta clase, he colocado varios otros controles (Etiquetas, Progessbar). El problema con esto es que los controles en el botón hacen que sea imposible disparar el botón. Haga clic en el evento o Button.MouseHover. ¿Cómo puedo lograr que los controles del botón solo se muestren pero sean "transparentes para el evento"? Un clic/desplazarse por la etiqueta y la barra de progreso es lo mismo que hacer clic/desplazarse directamente sobre el botón (incluido el remitente y todo). Algo así como "heredar los eventos del padre".C#, evento de incendio del contenedor

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

WinForms o WPF? –

Respuesta

1

Tener los controles secundarios como controles reales delante del botón (ya sea en una clase que hereda de Button o UserControl) puede dificultar que funcionen correctamente los eventos específicos del botón, como ya ha visto. (Edit: Aunque es difícil, no es imposible - véase la respuesta de Hans Passant)

Como solución alternativa, en lugar de utilizar los controles secundarios, podría ellos a medida pintar sobre la superficie botón, ya que no es necesario la mayor parte de la funcionalidad de los controles (eventos, enfoque, etc.), solo su pantalla.

Puede hacer la pintura adicional en el método OnPaint de su clase. Algo así como:

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

para actualizar la pantalla, que tendría que provocar un repintado del botón usando Invalidate().

Eche un vistazo a Custom Bitmap Button Using C# on CodeProject para obtener un ejemplo más completo.

4

Usted debe derivar de control de usuario a continuación, tienen el botón de control como un niño, y la burbuja hasta que el niño es el botón de evento de clic.

Este link es probablemente más de lo que necesita, pero es un buen punto de partida.

ACTUALIZACIÓN Como se señaló, es posible que no esté utilizando ASP.NET. Entonces, here es otra publicación que habla sobre los diferentes controles de usuario personalizados, específicamente lo que busca es un Composite Control. Esto es para formularios de Windows.

+0

Parece que no está usando asp.net (basado en la existencia de una ProgressBar en su código de ejemplo) –

+0

Buen punto, mala suposición de mi parte. Encontraré un ejemplo que funcione para winforms (o WPF?) – CodingGorilla

0

esta pregunta aquí hace un momento, pero se borraron:

¿Se puede heredar de UserControl en su lugar? Esto le permitirá colocar otros controles en la superficie de control, incluido su botón y suscribirse a sus eventos.

0

Si está utilizando WPF, supongo que lo que está buscando sería algo llamado Bubbled Events. Es una característica en WPF por la cual los eventos son burbujeados desde un control hasta su elemento principal (en su caso, sería desde su ProgressBar y etiqueta a su botón). Encontré this article on the matter que creo que podría ser de ayuda para usted.

Espero que esto ayude :)

3

Comentario Haga clic en controladores de eventos para la etiqueta y PB, tiene los llaman PerformClick().

Hacer los controles transparentes para el mouse es posible pero es feo de hacer. Tendría que anular WndProc() para capturar WM_NCHITTEST y devolver HTTRANSPARENT. La mejor solución para todos es no usar controles.Una etiqueta es simplemente TextRenderer.DrawText() en el evento Paint del botón. ProgressBar tampoco es difícil, e.Graphics.FillRectangle().

Cuestiones relacionadas