Поделиться через


Устранение неполадок с гибридными приложениями

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

Перекрывающиеся элементы управления

Элементы управления могут не перекрываться, как вы ожидали. Windows Forms использует отдельный HWND для каждого элемента управления. WPF использует один HWND для всего содержимого на странице. Эта разница в реализации вызывает неожиданные пересечения в поведении.

Элемент управления Windows Forms, размещенный в WPF, всегда отображается поверх содержимого WPF.

Содержимое WPF, размещенное в элементе ElementHost управления, находится на уровне z-порядка элемента ElementHost управления. Можно перекрывать ElementHost элементы управления, но размещенное содержимое WPF не объединяет или не взаимодействует.

Дочернее свойство

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

При назначении свойства WindowsFormsHost.Child или ElementHost.Child несколько свойств, связанных с макетом, содержащегося контента настраиваются автоматически. Изменение этих свойств содержимого может привести к непредвиденному поведению макета.

Ваше размещенное содержимое докировано для заполнения WindowsFormsHost и ElementHost родителя. Чтобы включить это поведение заливки, при установке дочернего свойства задаются несколько свойств. В следующей таблице перечислены свойства содержимого, заданные классами ElementHost и WindowsFormsHost.

Класс хоста Свойства содержимого
ElementHost Height

Width

Margin

VerticalAlignment

HorizontalAlignment
WindowsFormsHost Margin

Dock

AutoSize

Location

MaximumSize

Не устанавливайте эти свойства непосредственно в размещенном содержимом. Дополнительные сведения см. в разделе "Рекомендации по макету" для элемента WindowsFormsHost.

Приложения навигации могут не поддерживать состояние пользователя. Элемент WindowsFormsHost повторно создает элементы управления при использовании в приложении навигации. Повторное создание дочерних элементов управления происходит, когда пользователь переходит от страницы, в которой размещается WindowsFormsHost элемент, а затем возвращается к нему. Любое содержимое, введенное пользователем, будет потеряно.

Взаимодействие цикла сообщений

При работе с циклами сообщений Windows Forms сообщения могут не обрабатываться должным образом. Метод EnableWindowsFormsInterop вызывается конструктором WindowsFormsHost . Этот метод добавляет фильтр сообщений в цикл сообщений WPF. Этот фильтр вызывает метод Control.PreProcessMessage, если System.Windows.Forms.Control был целью сообщения, и преобразует или отправляет сообщение.

Если в цикле сообщений Windows Forms отображается Window, вы не сможете вводить текст, пока не вызовете метод Application.Run. Метод EnableModelessKeyboardInterop принимает Window и добавляет System.Windows.Forms.IMessageFilterсообщение, которое перенаправляет сообщения, связанные с ключами, в цикл сообщений WPF. Дополнительные сведения см. в статье Windows Forms и архитектура ввода взаимодействия WPF.

Прозрачность и многослойность

Класс HwndHost не поддерживает слои. Это означает, что установка свойства Opacity на элемент WindowsFormsHost не оказывает никакого эффекта, и не будет выполняться смешивание с другими окнами WPF, для которых свойство AllowsTransparency установлено на true.

Избавиться

Неправильное удаление классов может привести к утечке ресурсов. В ваших гибридных приложениях убедитесь, что классы WindowsFormsHost и ElementHost должным образом удалены, иначе могут возникнуть утечки ресурсов. Windows Forms удаляет ElementHost элементы управления при закрытии не модального родительского Form элемента. WPF удаляет WindowsFormsHost элементы при завершении работы приложения. В цикле сообщений Windows Forms можно отобразить элемент WindowsFormsHost в Window. В этом случае код может не получать уведомления о завершении работы приложения.

Включение визуальных стилей

Стили визуальных элементов Microsoft Windows XP в элементе управления Windows Forms могут быть не включены. Метод Application.EnableVisualStyles вызывается в шаблоне для приложения Windows Forms. Хотя этот метод по умолчанию не вызывается, если вы используете Visual Studio для создания проекта, вы получите стили визуальных элементов Microsoft Windows XP для элементов управления, если доступна версия 6.0 Comctl32.dll. Перед созданием дескрипторов в потоке вы должны вызвать метод EnableVisualStyles. Дополнительные сведения см. в разделе Практическое руководство. Включение визуальных стилей в гибридном приложении.

Лицензированные элементы управления

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

Элемент WindowsFormsHost происходит от класса HwndHost, а дескриптор дочернего элемента управления создается внутри метода BuildWindowCore. Класс HwndHost не позволяет обрабатывать сообщения в методе, но отображение диалогового BuildWindowCore окна приводит к отправке сообщений. Чтобы включить этот сценарий лицензирования, вызовите метод Control.CreateControl на элементе управления перед назначением его в качестве дочернего элемента для WindowsFormsHost.

Конструктор WPF

Содержимое WPF можно создать с помощью конструктора WPF для Visual Studio. В следующих разделах перечислены некоторые распространенные проблемы, которые могут возникнуть при создании гибридных приложений с помощью конструктора WPF.

BackColorTransparent игнорируется во время разработки

Свойство BackColorTransparent может не работать должным образом во время разработки.

Если элемент управления WPF не находится в видимом родительском контроле, среда выполнения WPF игнорирует значение BackColorTransparent. Причина, по которой BackColorTransparent может быть проигнорирован, заключается в том, что объект ElementHost создается в отдельном AppDomain. Однако при запуске приложения BackColorTransparent работает должным образом.

Список ошибок во время разработки отображается при удалении папки obj

Если папка obj удалена, появится список ошибок во время разработки.

При проектировании с ElementHost конструктор Windows Forms использует файлы, находящиеся в папке Debug или Release внутри папки obj вашего проекта. При удалении этих файлов появится список ошибок во время разработки. Чтобы устранить эту проблему, перестройте проект. Дополнительные сведения см. в разделеDesign-Time Ошибки в конструкторе Windows Forms.

ElementHost и IME

В настоящее время элементы управления WPF, размещенные в ElementHost, не поддерживают свойство ImeMode. Изменения в ImeMode будут игнорироваться размещенными элементами управления.

См. также