2011-09-14 11 views
5

Ho un Forms.DataVisualization.Charting.Chart in un WindowsFormsHost. Non riesco a ottenere il grafico per ricevere gli eventi della rotellina del mouse. I clic stanno funzionando, se provo con un Forms.TextBox funziona anche la rotellina del mouse. La rotellina del mouse funziona anche se utilizzo il grafico in un'app di moduli "nativi".WIndows Forms Chart in WindowsFormsHost non riceve la rotellina del mouse?

Quindi, ciò che rende il problema è la combinazione del grafico di forme in un formHost.

Ecco una semplice applicazione verry per replicare il problema:

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

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

e il codice sottostante:

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"; 
    } 

posso ricevere tutti i clic e la rotellina del mouse da WPF, ma nessuna ruota da forme. Ho provato anche l'ascoltatore di ruota delle forme, senza successo.

Qualche idea? Jon Skeet?

risposta

2

Questo è un problema di interoperabilità comune tra Windows Form (WinForms) e WPF. Gli eventi WPF si comportano in modo diverso, utilizzano l'evento indirizzato anziché la gestione degli eventi precedente di Windows Form.

WinForms è una mappa di gestione dei messaggi dal mondo Win32, pertanto è necessario codificarlo manualmente quando si incorpora il controllo WindowsForms su WPF. Per gestire eventi del mouse diversi dal clic del mouse (inclusa la rotellina del mouse), devi surrogare l'evento winforms.

MSDN libreria di .NET 4 parlato di questo in modo chiaro:

Surrogate Windows Form Message Loop

Per impostazione predefinita, la classe System.Windows.Forms.Application contiene il circuito primario messaggio per Applicazioni Windows Form. Durante l'interoperabilità, il ciclo di messaggi di Windows Form di non elabora i messaggi. Pertanto, questa logica deve essere riprodotta. Il gestore per l'evento ComponentDispatcher.ThreadFilterMessage esegue le seguenti operazioni :

1.Filters il messaggio utilizzando l'interfaccia IMessageFilter.

2.Cancante il metodo Control.PreProcessMessage.

3.Trasforma e invia il messaggio, se necessario.

4.Passa il messaggio al controllo di hosting, se nessun altro controlla elabora il messaggio.

Quando la maniglia della finestra viene distrutta, il controllo WindowsFormsHost si rimuove dalla registrazione.

Per maggiori informazioni, visitare: http://msdn.microsoft.com/en-us/library/ms742474.aspx

+0

Grazie per la tua spiegazione, ma che non mi aiuta molto in solfing il problema. Suppongo di dover eseguire manualmente gli eventi, ma non so come. Ho anche provato a catturare la rotella del mouse in WPF per inviare i miei comandi ai moduli, ma non sono in grado di catturare la ruota in WPF ...puoi fornire snippet di codice o idee su come superare effettivamente il problema? –

Problemi correlati