2008-09-10 2 views
10

Приложение с графическим интерфейсом должно размещать некоторые готовые компоненты на основе WinForm. Эти компоненты обеспечивают высокопроизводительные интерактивные представления, используя смесь GDI + и DirectX. Ручка представлений управляет вводом и отображением пользовательских графических визуализаций. Компоненты тестируются в жгуте проводов WinForms.Является ли WindowsFormsHost подходящим для цели (.net WPF-хостинг WinForms)?

Может ли коммерческое приложение использовать WPF для своего графического интерфейса и полагаться на WindowsFormsHost для размещения компонентов WinForms или , у вас есть опыт технических сбоев, например. задержки ввода, проблемы с обновлением, которые сделают вас осторожными?

ответ

21

В настоящее время мы используем WindowsFormsHost в нашем программном обеспечении для размещения элемента управления DataGridView WinForms, и у нас не было никаких реальных проблем с ним. Несколько вещей, на которые следует обратить внимание:

Первый - air-space restrictions. Практически это означает, что содержимое WinForms всегда появляется поверх содержимого WPF. Поэтому, если вы используете WPF adorners, они будут «обрезаны», если они попадут в область WinForms вашего приложения.

Во-вторых, поскольку они используют ресурсы Windows, вам необходимо более тщательно управлять временем жизни компонентов WinForms. В отличие от компонентов WPF, элементы управления WinForms предполагают, что они будут удалены, когда они закончатся. Это затрудняет включение их в чистый вид XAML.

Последнее, что элементы управления WinForms не изменяются так же плавно, как и остальная часть отображения WPF: они имеют тенденцию привязываться к их новому размеру, как только вы закончите настройку.

0

Я размещал элементы управления WPF в WinForms и наоборот без проблем. Хотя, я бы очень интенсивно тестировал такие сценарии, потому что трудно предсказать, как будет себя вести сложный контроль.

+1

Я думаю, вы имеете в виду `ElementHost`, а не` WindowsFormsHost`. – 2010-01-21 00:37:52

0

Обратите внимание на отсутствие объекта WPF Application при размещении в Winforms. Это может привести к проблемам, если вы используете существующий компонент WPF и размещаете его в Winforms, поскольку поиск ресурсов и подобные пользователи никогда не будут выглядеть в области приложения. Вы можете создать свой собственный объект Application, если это проблема.

+0

Я думаю, вы имеете в виду `ElementHost`, а не` WindowsFormsHost`. Возможно, правда наоборот противоположна. – 2010-01-21 00:38:15

0

Как @Kent Boogaart mentioned, я столкнулся с ситуацией, когда приложение WPF, размещенное в WinForms, не имеет объекта приложения WPF (т. Е. Application.Current). Это может вызвать множество проблем, таких как диспетчеры, не вызывающие потоки обратно в поток пользовательского интерфейса. Это применимо только в том случае, если вы размещаете в WinForms, а не наоборот.

У меня также были странные проблемы, когда модальные диалоги ведут себя странно (т. Е. Вызовы ShowModal). Я предполагаю, что это связано с тем, что в WinForms каждый элемент управления имеет свой собственный дескриптор Win32, хотя в WPF есть только один дескриптор для всего окна.

бы вы ни делали, тест :)

0

Вы можете решить проблему воздушного пространства с использованием .NET 3.5 SP1:

Этих типов ограничений воздушного пространства представляют огромное ограничение в рамках, как WPF, где состав элемента используется для создания богатых пользовательских впечатлений. С решением D3DImage эти ограничения не являются более длинными подарками!

См. Introduction to D3DImage.

+2

Artur, Статья, которую вы упомянули, относится к D3D, а не к размещению содержимого WinForms. Если я правильно понимаю проблемы, проблема воздушного пространства является фундаментальной проблемой, связанной с тем, как работает Win32, поскольку это вряд ли когда-либо исчезнет. – 2008-09-11 09:58:33

4

Одна из проблем, с которыми я столкнулся, заключается в том, что встроенные элементы управления Win Forms не участвуют ни в каких операциях преобразования, применяемых к их контейнеру WPF. Это приводит к визуальным проблесковым эффектам и встроенному управлению, появляющимся в неприемлемом месте. Я работал над этим, привязывая видимость хоста Windows Forms к состоянию анимации своего контейнера WPF, так что встроенный элемент управления был скрыт до завершения анимации, как показано ниже.

<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> 
Смежные вопросы