2011-09-14 13 views
5

Tengo Forms.DataVisualization.Charting.Chart en WindowsFormsHost. No puedo obtener la tabla para recibir eventos de la rueda del mouse. Los clics están funcionando, si intento con un Forms.TextBox la rueda del mouse también funciona. La rueda del mouse también funciona si uso el gráfico en una aplicación de formularios "nativa".Gráfico de formas de ventana en WindowsFormsHost no recibe la rueda del mouse?

Entonces, lo que hace que el problema sea la combinación del gráfico de formularios en un formsHost.

Aquí es una sencilla aplicación con mucho encanto para replicar el problema:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 

    <TextBlock Name="TextBlock1" Grid.Column="1" /> 
    <WindowsFormsHost Name="WindowsFormsHost1" Grid.Column="0"/> 
</Grid> 

y el código subyacente:

public MainWindow() 
    { 
     InitializeComponent(); 

     var chart = new Chart() { BackColor = System.Drawing.Color.Aquamarine}; 
     WindowsFormsHost1.Child = chart; 

     chart.MouseDown += (a, b) => TextBlock1.Text += "FORMS click\r\n"; 
     TextBlock1.MouseDown += (a, b) => TextBlock1.Text += "WPF click\r\n"; 

     chart.MouseWheel += (a, b) => TextBlock1.Text += "FORMS wheel\r\n"; 
     TextBlock1.MouseWheel += (a, b) => TextBlock1.Text += "WPF wheel\r\n"; 
    } 

puedo recibir todos los clics y la rueda del ratón de WPF, pero ninguna rueda de formas. Probé el oyente de la rueda de las formas, también, sin éxito.

¿Alguna idea? Jon Skeet?

Respuesta

2

Este es un problema de interoperabilidad común entre Windows Forms (WinForms) y WPF. Los eventos de WPF se comportan de manera diferente, usan eventos enrutados en lugar del antiguo manejo de eventos de Windows Forms.

WinForms en sí es un mapa del manejo de mensajes del mundo de Win32, por lo tanto, debe codificarlo manualmente al incorporar control de WindowsForms en WPF. Para manejar el evento del mouse además del clic del mouse (esto incluye la rueda del mouse), debe sustituir el evento winforms.

biblioteca MSDN de .NET 4 menciona claramente:

Surrogate Windows Forms Mensaje Loop

Por defecto, la clase System.Windows.Forms.Application contiene el principal mensaje bucle para Aplicaciones de Windows Forms. Durante la interoperación, el bucle de mensaje de Windows Forms no procesa los mensajes. Por lo tanto, esta lógica debe ser reproducida. El controlador para el evento ComponentDispatcher.ThreadFilterMessage realiza las siguientes pasos:

1.Filters el mensaje utilizando la interfaz de IMessageFilter.

2. Llama al método Control.PreProcessMessage.

3.Traduce y envía el mensaje, si es necesario.

4. Pasa el mensaje al control de alojamiento, si no hay otros controles procesan el mensaje.

Cuando se destruye el identificador de ventana, el control WindowsFormsHost se elimina del registro.

Para obtener más información, visite: http://msdn.microsoft.com/en-us/library/ms742474.aspx

+0

Gracias por su explicación, pero eso no me ayuda mucho en solfing el tema. Supongo que necesito desviar los eventos manualmente, pero no sé cómo. También traté de capturar la rueda del mouse en WPF para enviar mis propios comandos a los formularios, pero tampoco puedo capturar la rueda en WPF ...¿Puede proporcionar fragmentos de código o ideas sobre cómo superar realmente el problema? –

Cuestiones relacionadas