Устранение неполадок смешанных приложений
Обновлен: Ноябрь 2007
В этом разделе перечислены некоторые общие проблемы, которые могут возникнуть при создании смешанных приложений, использующих обе технологии WPF и Windows Forms.
Перекрывающиеся элементы управления
Элементы управления могут не перекрываться должным образом. Windows Forms использует отдельный HWND для каждого элемента управления. WPF использует один HWND для всего содержимого на странице. Это отличие в реализации вызывает неожиданные перекрывающиеся поведения.
Элемент управления Windows Forms, размещенный в WPF, всегда появляется в верхней части содержимого WPF.
Содержимое WPF, размещенное в элементе управления ElementHost, появляется в упорядоченной по z-координате последовательности элемента управления ElementHost. Возможно перекрытие элементов управления ElementHost, но размещенное содержимое WPF не объединяется и не взаимодействует.
Child Property
Классы WindowsFormsHost и ElementHost могут размещать только один дочерний элемент управления или элемент. Для размещения более одного элемента управления или элемента, необходимо использовать контейнер в качестве дочернего содержимого. Например, можно добавить кнопку Windows Forms и элементы управления «флажок» к элементу управления System.Windows.Forms.Panel, а затем назначить панель как WindowsFormsHost свойства Child элемента управления. Однако, нельзя добавить элемент управления кнопка и флажок отдельно от того же элемента управления WindowsFormsHost.
Масштабирование
WPF и Windows Forms имеют различные модели масштабирования. Некоторые преобразования масштаба WPF являются показательными для элемента управления Windows Forms, а некоторые — нет. Например, масштабирование элемента управления Windows Forms к 0 будет работать, но если попытаться масштабировать тот же элемент управления обратно на ненулевое значение, то размер элемента управления останется равным 0. Дополнительные сведения содержатся в разделе Вопросы, связанные с макетом элемента WindowsFormsHost.
Адаптер
Путаница может быть при работе с классами WindowsFormsHost и ElementHost, так как они содержат скрытый контейнер. Оба класса WindowsFormsHost и ElementHost имеют скрытые контейнеры, с именем адаптер, которые они используют для размещения содержимого. Для элемента WindowsFormsHost адаптер извлекается из класса System.Windows.Forms.ContainerControl. Для элемента управления ElementHost адаптер извлекается из элемента DockPanel. При появлении ссылок на адаптер в других разделах взаимодействия, этот контейнер становится контейнером, о котором шла речь.
Вложение
Не поддерживается вложение элемента управления WindowsFormsHost в элемент управления ElementHost. Также не поддерживается вложение элемента ElementHost в элемент WindowsFormsHost.
Фокус
Фокус работает по-разному в WPF и Windows Forms, что означает, что в смешанном приложении могут возникать проблемы с фокусом. Например, если имеется фокус внутри элемента WindowsFormsHost и нужно или свернуть и восстановить страницу или показать модальное диалоговое окно, то фокус внутри элемента WindowsFormsHost может быть потерян. Элемент WindowsFormsHost по-прежнему имеет фокус, но элемент управления внутри него может не иметь.
Фокус также влияет и на проверку данных. Проверка работает в элементе WindowsFormsHost, но не работает при выходе за пределы элемента WindowsFormsHost или между двумя различными элементами WindowsFormsHost.
Сопоставление свойств
Некоторые сопоставления свойств требуют всесторонней интерпретации для того, чтобы связать отличающиеся реализации между технологиями WPF и Windows Forms. Сопоставления свойств позволяют коду реагировать на изменения в шрифтах, цветах и других свойствах. В общем случае сопоставление свойств работает посредством перехвата событий PropertyChanged или вызовов OnPropertyChanged, и установкой свойств либо на дочерний элемент либо на его адаптер. Дополнительные сведения см. в разделе Сопоставление свойств Windows Forms и WPF.
Связанные с макетом свойства в размещенном содержимом
При назначении свойства WindowsFormsHost.Child или ElementHost.Child, некоторые связанные с макетом свойства в размещенном содержимом устанавливается автоматически. Изменение этих свойств содержимого может привести к неожиданным поведениям макета.
Размещенное содержимое присоединяется для заполнения родителя WindowsFormsHost и ElementHost. Чтобы включить это поведение заполнения, некоторые свойства устанавливаются при установке дочернего свойства. В следующей таблице перечислены какие свойства содержимого задаются классами ElementHost и WindowsFormsHost.
Host Class |
Свойства содержимого |
---|---|
Не устанавливайте эти свойства непосредственно на размещенном содержимом. Дополнительные сведения см. в разделе Вопросы, связанные с макетом элемента WindowsFormsHost.
Приложения навигации
Приложения навигации могут не поддерживать состояние пользователя. Элемент WindowsFormsHost восстанавливает свои элементы управления в случае его использования в приложении навигации. Восстановление дочерних элементов управления происходит, когда пользователь выходит за переделы страницы, размещающей элемент WindowsFormsHost, а затем возвращается на нее. Любое содержимое, введенное пользователем, будет потеряно.
Взаимодействие с циклом обработки сообщений
При работе с циклом обработки сообщений Windows Forms, сообщения могут обрабатываться не так, как ожидается. Метод EnableWindowsFormsInterop вызывается конструктором WindowsFormsHost. Этот метод добавляет фильтр сообщений к циклу обработки сообщений WPF. Этот фильтр вызывает метод Control.PreProcessMessage в случае, если System.Windows.Forms.Control являлся целью сообщения, и переводит/отправляет сообщение.
Если отобразить Window в цикле обработки сообщения Windows Forms с Application.Run, то вы не сможете что-либо печатать до тех пор, пока не вызовете метод EnableModelessKeyboardInterop. Метод EnableModelessKeyboardInterop принимает Window и добавляет System.Windows.Forms.IMessageFilter, который перенаправляет связанные с ключом сообщения на цикл обработки сообщений WPF. Дополнительные сведения см. в разделе Windows Forms и архитектура ввода взаимодействия WPF.
Непрозрачность и иерархическое представление
Класс HwndHost не поддерживает иерархическое представление. Это означает, что установка свойства Opacity на элементе WindowsFormsHost не дает результата, и не произойдет смешение с другими окнами WPF, которые имеет AllowsTransparency, заданное равным true.
Dispose
Неудаленные классы вполне могут дать утечку ресурсов. В смешанных приложениях убедитесь, что удалены классы WindowsFormsHost и ElementHost, в противном случае можно потерять ресурсы. Windows Forms удаляет элементы управления ElementHost, если закрывается его немодальный родитель Form. WPF удаляет элементы WindowsFormsHost при завершении работы приложения. Можно отобразить элемент WindowsFormsHost в Window в цикле обработки сообщения Windows Forms. В этом случае ваш код может не получить уведомление о том, что приложение завершает работу.
Включение визуальных стилей
Стили визуального отображения Microsoft Windows XP на элементе управления Windows Forms могут быть недоступны. Метод Application.EnableVisualStyles вызывается в шаблоне для приложения Windows Forms. Хотя этот метод не вызывается по умолчанию, если для создания проекта используется Visual Studio, вы получите стили визуального отображения Microsoft Windows XP для элементов управления, если доступен Comctl32.dll версии 6.0. Необходимо вызвать метод EnableVisualStyles перед созданием в потоке обработчиков. Дополнительные сведения см. в разделе Практическое руководство. Включение визуальных стилей в гибридном приложении.
Лицензированные элементы управления
Лицензированные элементы управления Windows Forms, отображающие в окне сообщения информацию о лицензировании, могут вызвать непредвиденное поведение для смешанного приложения. Некоторые лицензированные элементы управления отображают диалоговое окно в ответ на создание обработчика. Например, лицензированный элемент управления может информировать пользователя о том, что нужна лицензия, или о том, что пользователю осталось три пробных запуска элемента управления.
Элемент WindowsFormsHost получается из класса HwndHost, а обработчик дочернего элемента управления создается внутри метода BuildWindowCore. Класс HwndHost не позволяет сообщениям обрабатываться в методе BuildWindowCore, но отображение диалогового окна вызывает сообщения для отправки. Чтобы включить этот сценарий лицензирования, вызовите метод Control.CreateControl на элемент управления перед тем, как назначить его дочерним элементом WindowsFormsHost.
Конструктор WPF
Можно разработать содержимое WPF посредством Windows Presentation Foundation (WPF) для Visual Studio (конструктор). В следующих разделах перечислены некоторые общие проблемы, которые могут возникнуть при создании смешанных приложений с помощью WPF (конструктор).
Во время разработки игнорируется BackColorTransparent
Во время разработки свойство BackColorTransparent может не работать должным образом.
Если элемент управления WPF не находится на видимом родителе, исполняющая среда WPF игнорирует значение BackColorTransparent. Причина того, что BackColorTransparent может быть проигнорирован, заключается в том, что объект ElementHost создается в отдельном AppDomain. Однако, при запуске приложения BackColorTransparent не работает должным образом.
При удалении папки obj появляется список ошибок времени разработки.
Если удалена папка obj, то появляется список ошибок времени разработки.
При разработке с использованием ElementHost конструктор Windows Forms используют созданные файлы в папке Debug или Release внутри папки проекта obj. При удалении этих файлов появляется список ошибок времени разработки. Для устранения этой проблемы следует перестроить проект. Дополнительные сведения см. в разделе Ошибки во время разработки в конструкторе Windows Forms Designer.
ElementHost и IME
Элементы управления WPF, в данный момент размещенные в ElementHost, не поддерживают свойство ImeMode. Изменение на ImeMode будет проигнорировано размещенными элементами управления.
См. также
Задачи
Практическое руководство. Включение визуальных стилей в гибридном приложении
Основные понятия
Windows Forms и архитектура ввода взаимодействия WPF
Вопросы, связанные с макетом элемента WindowsFormsHost
Сопоставление свойств Windows Forms и WPF
Ошибки во время разработки в конструкторе Windows Forms Designer