2011-09-14 6 views
5

WindowsFormsHost에 Forms.DataVisualization.Charting.Chart가 있습니다. 마우스 휠 이벤트를받을 차트를 가져올 수 없습니다. 마우스 휠이 작동하는 Forms.TextBox를 클릭하면 클릭이 작동합니다. "네이티브"양식 앱에서 차트를 사용하는 경우 마우스 휠이 작동합니다.WindowsFormsHost의 Windows Forms 차트는 마우스 휠을받지 못합니까?

그래서 문제는 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에서 마우스 휠을받을 수 있지만 휠에서 여기

문제를 복제 할의 verry 간단한 응용 프로그램입니다 양식. 나는 형식의 휠 리스너를 시도했지만 성공하지 못했습니다.

아이디어가 있으십니까? 존 스켓?

답변

2

이것은 Windows Forms (WinForms)와 WPF 간의 일반적인 상호 운용성 문제입니다. WPF 이벤트는 다르게 동작하며 Windows Forms의 이전 이벤트 처리 대신 라우팅 된 이벤트를 사용합니다.

WinForms 자체는 Win32 세계에서 처리하는 메시지 맵이므로 WPF에서 WindowsForms 컨트롤을 포함 할 때 수동으로 코드화해야합니다. 마우스 클릭 (마우스 휠 포함) 이외의 마우스 이벤트를 처리하려면 winforms 이벤트를 대체해야합니다.

.NET 4의

MSDN 라이브러리이 명확하게 언급 :

대리 윈도우 메시지 루프 기본적으로

에서, System.Windows.Forms.Application 클래스에 대한 기본 메시지 루프를 포함 양식 Windows Forms 응용 프로그램. 상호 운용 중에 Windows Forms 메시지 루프는 메시지를 처리하지 않습니다. 따라서이 로직을 재생해야합니다. ComponentDispatcher.ThreadFilterMessage 이벤트의 처리기는 다음과 같은 단계를 수행합니다.

1. IMessageFilter 인터페이스를 사용하여 메시지를 필터링합니다.

2. Control.PreProcessMessage 메서드를 호출합니다.

3. 필요한 경우 메시지를 번역하고 발송합니다.

4. 다른 컨트롤이없는 경우 호스팅 컨트롤에 메시지를 전달합니다. 메시지를 처리합니다.

Windows 핸들이 파괴되면 WindowsFormsHost 컨트롤 자체가 등록에서 제거됩니다. http://msdn.microsoft.com/en-us/library/ms742474.aspx

+0

당신의 설명을 주셔서 감사합니다,하지만이 문제를 solfing 나에게 많은 도움이되지 않습니다

더 많은 정보를 위해, 방문하십시오. 내가 수동으로 이벤트를 라우팅해야 할 것 같아요,하지만 난 어떻게 모르겠어요. WPF에서 마우스 휠을 캡처하여 양식에 직접 명령을 보내려고했지만 WPF에서 휠을 캡처 할 수는 없습니다 ...코드 스 니펫이나 아이디어를 제공하여 문제를 실제로 극복 할 수 있습니까? –