Подходит ли WindowsFormsHost для целей (.net WPF хостинг WinForms)?

приложение, управляемое GUI, должно содержать некоторые встроенные компоненты на основе WinForms. Эти компоненты обеспечивают высокую производительность интерактивных представлений с использованием смеси GDI+ и DirectX. Вид ручки входной контроль и отображение графического изображения. Компоненты испытаны в проводке WinForms поставщиком.

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

6 ответов


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

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

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

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


одна проблема, с которой я столкнулся, заключается в том, что встроенные элементы управления Win Forms не участвуют ни в каких операциях преобразования, применяемых к их контейнеру WPF. Это приводит к визуальным мигающим эффектам и встроенному элементу управления, появляющемуся в местоположении innappropriate. Я обошел это, связав видимость узла 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>

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


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


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

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

Что бы вы ни делали, проверить :)


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

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

посмотреть введение в D3DImage.