2008-09-10 28 views
10

Một ứng dụng điều khiển GUI cần lưu trữ một số thành phần dựa trên WinForms dựng sẵn. Các thành phần này cung cấp chế độ xem tương tác hiệu suất cao bằng cách sử dụng hỗn hợp của GDI + và DirectX. Các chế độ xem xử lý đầu vào điều khiển và hiển thị các kết xuất đồ họa tùy chỉnh. Các thành phần được kiểm tra trong bộ phận khai thác WinForms của nhà cung cấp.WindowsFormsHost có phù hợp với mục đích (.net WPF lưu trữ WinForms) không?

Ứng dụng commericial có thể sử dụng WPF cho GUI của nó và dựa trên WindowsFormsHost để lưu trữ các thành phần WinForms hoặc bạn có gặp phải sự cố ổn định kỹ thuật hay không. lỗi đầu vào, các vấn đề cập nhật sẽ khiến bạn thận trọng?

Trả lời

21

Hiện tại chúng tôi đang sử dụng WindowsFormsHost trong phần mềm của chúng tôi để lưu trữ kiểm soát WinForms DataGridView và chúng tôi không gặp phải bất kỳ sự cố nào với nó. Tuy nhiên, một vài điều cần lưu ý:

Đầu tiên là air-space restrictions. Thực tế, điều này có nghĩa là nội dung WinForms luôn xuất hiện trên đầu trang của nội dung WPF. Vì vậy, nếu bạn đang sử dụng WPF adorners họ sẽ xuất hiện để được "cắt" nếu họ nhấn lên chống lại một khu vực WinForms trong ứng dụng của bạn.

Điều thứ hai là, vì chúng sử dụng tài nguyên Windows, bạn phải quản lý thời gian sống của các thành phần WinForms cẩn thận hơn. Không giống như các thành phần WPF, các điều khiển WinForms mong đợi được xử lý khi chúng kết thúc. Điều này làm cho nó khó khăn để đưa chúng vào một khung nhìn XAML thuần túy.

Điều cuối cùng là điều khiển WinForms dường như không thay đổi kích cỡ một cách trơn tru như phần còn lại của màn hình WPF: chúng có xu hướng chụp nhanh kích thước mới của chúng khi bạn đã hoàn thành việc điều chỉnh.

0

Tôi đã lưu trữ các điều khiển WPF trong WinForms và ngược lại mà không gặp sự cố nào. Mặc dù, tôi sẽ thử nghiệm các kịch bản như vậy một cách rộng rãi bởi vì rất khó để dự đoán sự kiểm soát phức tạp sẽ hoạt động như thế nào.

+1

Tôi nghĩ bạn đang đề cập đến 'ElementHost', không phải' WindowsFormsHost'. –

0

Lưu ý rằng sự vắng mặt của đối tượng WPF Application khi lưu trữ trong Winforms. Điều này có thể dẫn đến vấn đề nếu bạn đang dùng một thành phần WPF hiện có và lưu trữ nó trong Winforms, vì tra cứu tài nguyên và các lượt thích sẽ không bao giờ nhìn vào phạm vi ứng dụng. Bạn có thể tạo đối tượng Application của riêng mình nếu đó là vấn đề.

+0

Tôi nghĩ rằng bạn đang đề cập đến 'ElementHost', không phải' WindowsFormsHost'. Có lẽ điều ngược lại là ngược lại. –

0

@Kent Boogaart mentioned, tôi đã chạy vào tình huống nơi ứng dụng WPF được lưu trữ trong WinForms không có đối tượng Application WPF (ví dụ: Application.Current). Điều này có thể gây ra nhiều vấn đề, chẳng hạn như Dispatchers không gọi các luồng lại cho thread UI. Điều này sẽ chỉ áp dụng nếu bạn đang lưu trữ trong WinForms, không phải là cách khác xung quanh.

Tôi cũng gặp sự cố lạ với các hộp thoại phương thức hoạt động lạ (tức là các cuộc gọi ShowModal). Tôi giả định này là bởi vì, trong WinForms, mỗi điều khiển có Win32 xử lý riêng của mình trong khi trong WPF, chỉ có một xử lý cho toàn bộ cửa sổ.

Dù bạn làm gì, thử nghiệm :)

0

Bạn có thể giải quyết vấn đề bằng cách sử dụng Vùng trời .net 3.5 SP1:

Những loại hạn chế không phận đại diện cho một hạn chế rất lớn trong một khuôn khổ , như WPF, trong đó phần tử được sử dụng để tạo ra rất nhiều trải nghiệm người dùng phong phú. Với giải pháp D3DImage , những hạn chế này không còn là nữa!

Xem Introduction to D3DImage.

+2

Artur, Bài viết mà bạn đề cập đến áp dụng cho D3D thay vì lưu trữ nội dung WinForms. Nếu tôi hiểu các vấn đề một cách chính xác, vấn đề không phận là vấn đề cơ bản liên quan đến cách thức hoạt động của Win32, như không bao giờ có thể biến mất. –

+0

Chỉ cần nhìn thấy điều này ngày hôm nay. Bạn nói đúng, D3D duy nhất của nó. –

4

Một vấn đề mà tôi đã gặp phải là các điều khiển Win Forms được nhúng không tham gia vào bất kỳ hoạt động biến đổi nào được áp dụng cho vùng chứa WPF của họ. Điều này dẫn đến hiệu ứng nhấp nháy trực quan và điều khiển được nhúng xuất hiện ở vị trí không phù hợp. Tôi đã làm việc xung quanh điều này bằng cách ràng buộc khả năng hiển thị của Windows Forms Host với trạng thái hoạt hình của thùng chứa WPF của nó, để điều khiển nhúng được ẩn cho đến khi hoạt ảnh hoàn thành, như dưới đây.

<WindowsFormsHost Grid.Row="1" Grid.Column="1" Margin="8,0,0,0" 
    Visibility="{Binding ActualHeight, RelativeSource={RelativeSource 
    Mode=FindAncestor, AncestorType=UserControl}, 
    Converter={StaticResource WinFormsControlVisibilityConverter}}" > 

    <winforms:DateTimePicker x:Name="datepickerOrderExpected" Width="140" 
     Format="Custom" CustomFormat="M/dd/yy h:mm tt" 
     ValueChanged="OnEditDateTimeOrderExpected" /> 

</WindowsFormsHost> 
Các vấn đề liên quan