Подходит ли 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.