2011-09-14 28 views
5

tôi có một Forms.DataVisualization.Charting.Chart trong WindowsFormsHost. Tôi không thể lấy biểu đồ để nhận các sự kiện bánh xe chuột. Các nhấp chuột đang hoạt động, nếu tôi thử với một Forms.TextBox, bánh xe chuột cũng đang hoạt động. Bánh xe chuột cũng hoạt động nếu tôi sử dụng biểu đồ trong ứng dụng biểu mẫu "gốc".Biểu đồ Hình thức WIndows trong WindowsFormsHost không nhận được bánh xe chuột?

Vì vậy, điều làm cho vấn đề là sự kết hợp của biểu đồ biểu mẫu trong một formHost.

Đây là một ứng dụng đơn giản verry để nhân rộng các vấn đề:

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

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

và mã đằng sau:

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

tôi có thể nhận được tất cả nhấp chuột và bánh xe chuột từ WPF, nhưng không có bánh xe từ các hình thức. Tôi đã thử người nghe bánh xe của formsHost là tốt, mà không thành công.

Bất kỳ ý tưởng nào? Jon Skeet?

Trả lời

2

Đây là vấn đề tương thích phổ biến giữa Windows Forms (WinForms) và WPF. Các sự kiện WPF hoạt động khác nhau, chúng sử dụng sự kiện định tuyến thay vì xử lý sự kiện cũ của Windows Forms.

Bản thân WinForms là bản đồ xử lý thư từ thế giới Win32, do đó bạn phải mã hóa thủ công khi nhúng điều khiển WindowsForms trên WPF. Để xử lý sự kiện chuột khác với nhấp chuột (bao gồm cả bánh xe chuột), bạn phải thay thế sự kiện winforms.

MSDN thư viện .NET 4 nêu rõ điều này:

Surrogate Windows Forms nhắn Vòng

Theo mặc định, lớp System.Windows.Forms.Application chứa chính nhắn vòng lặp cho Các ứng dụng Windows Forms. Trong quá trình liên kết, vòng lặp tin nhắn của Windows Forms không xử lý tin nhắn. Do đó, logic này phải được sao chép. Trình xử lý cho sự kiện ComponentDispatcher.ThreadFilterMessage thực hiện các bước sau đây:

1.Thử thư bằng giao diện IMessageFilter.

2.Thêm phương thức Control.PreProcessMessage.

3. Dịch và gửi tin nhắn, nếu cần.

4. Gửi thông báo đến bộ điều khiển lưu trữ, nếu không có điều khiển nào khác, hãy xử lý thông báo .

Khi tay cầm cửa sổ bị hủy, điều khiển WindowsFormsHost tự xóa khỏi đăng ký.

Mọi chi tiết, tham quan: http://msdn.microsoft.com/en-us/library/ms742474.aspx

+0

Cảm ơn bạn đã giải thích của bạn, nhưng điều đó không giúp tôi rất nhiều trong solfing vấn đề này. Tôi đoán rằng tôi cần phải định tuyến các sự kiện bằng tay, nhưng tôi không biết làm thế nào. Tôi cũng đã cố gắng để nắm bắt các bánh xe chuột trong WPF để gửi các lệnh của riêng tôi để các hình thức, nhưng tôi không thể nắm bắt các bánh xe trong WPF hoặc ...bạn có thể cung cấp đoạn mã hoặc ý tưởng làm cách nào để khắc phục sự cố không? –

Các vấn đề liên quan