Tengo un panel en mi Formulario con un controlador de evento de clic. También tengo algunos otros controles dentro del panel (etiqueta, otros paneles, etc.). Quiero que el evento click se registre si hace clic en cualquier lugar dentro del panel. El evento de clic funciona siempre que no haga clic en ninguno de los controles dentro del panel, pero quiero activar el evento sin importar dónde haga clic dentro del panel. ¿Es esto posible sin agregar el mismo evento de clic a todos los controles dentro del panel?Manejo de un evento de clic en cualquier lugar dentro de un panel en C#
Respuesta
Usted solía ser capaz de anular el método OnBubbleEvent en el control. En WPF el mecanismo se denomina eventos enrutados: http://weblogs.asp.net/vblasberg/archive/2010/03/30/wpf-routed-events-bubbling-several-layers-up.aspx
que necesitaba la misma funcionalidad exacta de hoy, por lo que este se ha probado y funciona:
1: Crear un subclasser que puede arrebatar el clic de ratón:
internal class MessageSnatcher : NativeWindow
{
public event EventHandler LeftMouseClickOccured = delegate{};
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_PARENTNOTIFY = 0x210;
private readonly Control _control;
public MessageSnatcher(Control control)
{
if (control.Handle != IntPtr.Zero)
AssignHandle(control.Handle);
else
control.HandleCreated += OnHandleCreated;
control.HandleDestroyed += OnHandleDestroyed;
_control = control;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_PARENTNOTIFY)
{
if (m.WParam.ToInt64() == WM_LBUTTONDOWN)
LeftMouseClickOccured(this, EventArgs.Empty);
}
base.WndProc(ref m);
}
private void OnHandleCreated(object sender, EventArgs e)
{
AssignHandle(_control.Handle);
}
private void OnHandleDestroyed(object sender, EventArgs e)
{
ReleaseHandle();
}
}
2: Inicializar el ladrón para conectar en el panel de WndProc:
private MessageSnatcher _snatcher;
public Form1()
{
InitializeComponent();
_snatcher = new MessageSnatcher(this.panel1);
}
3: el ladrón de mensaje tendrá la WM_PARENTNOTIFY si hace clic en un chi ld control.
Técnicamente es posible, aunque es muy feo. Debe capturar el mensaje antes de que se envía al control que se hizo clic. Lo que puede hacer con IMessageFilter, puede oler un mensaje de entrada que se eliminó de la cola de mensajes antes de enviarlo. De esta manera:
using System;
using System.Drawing;
using System.Windows.Forms;
class MyPanel : Panel, IMessageFilter {
public MyPanel() {
Application.AddMessageFilter(this);
}
protected override void Dispose(bool disposing) {
if (disposing) Application.RemoveMessageFilter(this);
base.Dispose(disposing);
}
public bool PreFilterMessage(ref Message m) {
if (m.HWnd == this.Handle) {
if (m.Msg == 0x201) { // Trap WM_LBUTTONDOWN
Point pos = new Point(m.LParam.ToInt32());
// Do something with this, return true if the control shouldn't see it
//...
// return true
}
}
return false;
}
}
+1 También hice esto y acepto que debería funcionar bien. Mi única advertencia es que básicamente se une a la bomba de mensajes de eventos de aplicaciones, así que asegúrese de hacer lo que haga en el paso "Hacer algo con esto ...", hacerlo rápido y eficiente. –
Meh, ya está filtrado para el panel y el mensaje. Este código se ejecuta en tiempo humano. –
poco tarde a la fiesta, pero lo que hice fue mapear todo el evento click de todos los controles en el interior del panel de eventos del panel de clic. Sé que su enfoque desagradable. ¡¡pero hey!!
- 1. Manejo de evento de evento de elemento en el panel de árbol Extjs 4
- 2. WPF: ¿cómo manejo un clic en un elemento de ListBox?
- 3. $ ('html'). Clic() ... en cualquier lugar excepto un elemento
- 4. cómo disparar un evento cuando alguien hace clic en cualquier lugar de la pantalla en una aplicación de Android?
- 5. Agregar Haga clic en Panel de Evento con ExtJS
- 6. Complemento de Outlook. Coloque un formulario en lugar de panel de mensajes y panel de lectura
- 7. ¿Cómo manejo un clic en algún lugar de la página, incluso cuando un elemento determinado detiene la propagación?
- 8. Manejo de un elemento de menú Haga clic en Evento - Android
- 9. jQuery ocultar elemento al hacer clic en cualquier lugar de la página
- 10. ¿es una variable global de evento accesible en cualquier lugar dentro de la cadena de devolución de llamada?
- 11. ¿Cómo configuro un evento de clic para un formulario?
- 12. Seguir el enlace dentro del evento clic de JQuery
- 13. Haga clic en el evento de opción
- 14. ASP.NET: compruebe si hay un evento de clic en page_load
- 15. jQuery: ¿Cerrar DIV haciendo clic en cualquier lugar aparte del DIV mismo?
- 16. C# Desplazamiento de un panel en forma de ventanas
- 17. Activar un evento en `clic` y` enter`
- 18. jQuery: Fuego clic en el evento en un lapso de
- 19. ASP.NET determinar en qué botón se hizo clic dentro de un panel de actualización en el evento de carga de página
- 20. cómo ocultar div con jquery al hacer clic en cualquier lugar excepto en un div?
- 21. Simulando un evento de clic de mouse en PyQt
- 22. evitar la 'doble acontecimiento' cuando se hace clic ETIQUETAS dentro de un elemento con un evento de clic
- 23. agregando un evento de clic a fullcalendar
- 24. C# Autocompletar evento de clic de Texbox
- 25. ¿Puedo definir un alcance en cualquier lugar de Python?
- 26. Agregar un evento de clic a un elemento?
- 27. WPF. Captura la última ventana, haz clic en cualquier lugar
- 28. Mejor práctica de prototipo para "hacer clic en cualquier lugar para cerrar"?
- 29. Cómo obtener el evento de clic del mouse en el panel Bandeja de entrada cuando un usuario selecciona un correo electrónico
- 30. ¿Cómo obtengo la posición absoluta de un clic de un evento onClick en el cuerpo?
¿Es este WPF .....? –
No, solo una aplicación de formularios de windows normal –