2011-09-14 41 views
5

我在WindowsFormsHost中有一個Forms.DataVisualization.Charting.Chart。我無法讓圖表接收鼠標滾輪事件。點擊工作,如果我嘗試使用Forms.TextBox鼠標滾輪也在工作。如果我在「本地」表單應用中使用圖表,鼠標滾輪也可以工作。WindowsFormsHost中的Windows窗體圖表沒有收到鼠標滾輪?

那麼,是什麼使得問題是formsHost中形式圖的組合。

這裏是一個檸簡單的應用程序複製問題:

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

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

和後面的代碼:

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

可以接收所有點擊和從WPF鼠標滾輪,但是沒有從輪形式。我也嘗試了FormsHost的車輪聽衆,但沒有成功。

任何想法? Jon Skeet?

回答

2

這是Windows窗體(WinForms)和WPF之間的常見互操作性問題。 WPF事件的行爲不同,它們使用路由事件而不是Windows窗體的舊事件處理。

WinForms本身是Win32世界中的消息處理映射,因此在WPF中嵌入WindowsForms控件時必須手動編寫它。爲了處理除鼠標點擊之外的鼠標事件(包括鼠標滾輪),您必須代替winforms事件。

的.NET 4

MSDN庫提到了這一點清楚:

代孕Windows窗體消息循環

默認情況下,System.Windows.Forms.Application類包含主要消息 環路Windows窗體應用程序。在互操作期間,Windows窗體消息循環不處理消息。因此,這個邏輯必須被複制。 ComponentDispatcher.ThreadFilterMessage事件的處理程序執行以下步驟 步驟:

1.使用IMessageFilter接口過濾消息。

2.調用Control.PreProcessMessage方法。

3.如果需要的話,翻譯和發送消息。

4.如果沒有其他控件 處理消息,則將消息傳遞給主機控件。

當窗口句柄被銷燬時,WindowsFormsHost控件將自己從註冊中刪除。

欲瞭解更多信息,請訪問: http://msdn.microsoft.com/en-us/library/ms742474.aspx

+0

謝謝你的解釋,但是這並不能幫助我很多solfing問題。我想我需要手動排除事件,但我不知道如何。我也嘗試捕獲在WPF中的鼠標滾輪發送我自己的命令的形式,但我無法捕捉WPF中的輪...你能提供代碼片段或想法如何克服這個問題嗎? –