Подходит ли WindowsFormsHost по назначению (.net WPF, размещающий WinForms)? - PullRequest
10 голосов
/ 10 сентября 2008

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

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

Ответы [ 6 ]

21 голосов
/ 10 сентября 2008

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

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

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

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

4 голосов
/ 16 сентября 2008

Одна проблема, с которой я столкнулся, заключается в том, что встроенные элементы управления 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>
0 голосов
/ 10 сентября 2008

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

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

См. Введение в D3DImage .

0 голосов
/ 10 сентября 2008

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

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

Что бы вы ни делали, тестируйте:)

0 голосов
/ 10 сентября 2008

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

0 голосов
/ 10 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...