Рекомендации по макету элемента WindowsFormsHost
В этом разделе описывается взаимодействие элемента WindowsFormsHost с системой макета WPF.
WPF и Windows Forms поддерживают разные, но аналогичные логики для изменения размера и размещения элементов на форме или странице. При создании гибридного пользовательского интерфейса, на котором размещены элементы управления Windows Forms в WPF, элемент WindowsFormsHost интегрирует две схемы макета.
Различия в макете между WPF и Windows Forms
WPF использует разрешение-независимый макет. Все измерения макета WPF указываются с помощью пикселей, независимых от устройства. Пиксель, независимый от устройства, имеет размер одна девяносто шестая дюйма и не зависит от разрешения, поэтому вы получаете аналогичные результаты независимо от того, происходит отрисовка на мониторе с разрешением 72 dpi или на принтере с разрешением 19 200 dpi.
WPF также основывается на динамическом макете. Это означает, что элемент пользовательского интерфейса упорядочивает себя на форме или странице в соответствии с его содержимым, его родительским контейнером макета и доступным размером экрана. Динамический макет упрощает локализацию, автоматически настраивая размер и положение элементов пользовательского интерфейса при изменении длины строк.
Макет в Windows Forms зависит от устройства и, скорее всего, будет статическим. Как правило, элементы управления Windows Forms размещаются абсолютно на форме с помощью измерений, указанных в аппаратных пикселях. Однако Windows Forms поддерживает некоторые функции динамического макета, как описано в следующей таблице.
Функция макета | Описание |
---|---|
Автоматическое масштабирование | Некоторые элементы управления Windows Forms автоматически изменяют свой размер, чтобы правильно отображать содержимое. Дополнительные сведения см. в обзоре свойств autoSize. |
Привязка и закрепление | Элементы управления Windows Forms поддерживают размещение и изменение размера на основе родительского контейнера. Дополнительные сведения см. в Control.Anchor и Control.Dock. |
Автомасштабирование | Элементы управления контейнерами изменяют размер сами и у их дочерних элементов в зависимости от разрешения выходного устройства или размера шрифта контейнера по умолчанию в пикселях. Дополнительные сведения см. в статье Автоматическое масштабирование в Windows Forms. |
Контейнеры макета | Элементы управления FlowLayoutPanel и TableLayoutPanel упорядочивали их дочерние элементы управления и размер в соответствии с их содержимым. |
Ограничения макета
Как правило, элементы управления Windows Forms нельзя масштабировать и преобразовывать в максимально возможном объеме в WPF. В следующем списке описываются известные ограничения, когда элемент WindowsFormsHost пытается интегрировать его размещенный элемент управления Windows Forms в систему макета WPF.
В некоторых случаях элементы управления Windows Forms не могут быть изменены или могут иметь только определенные размеры. Например, элемент управления windows Forms ComboBox поддерживает только одну высоту, которая определяется размером шрифта элемента управления. В динамическом макете WPF, где элементы могут растянуться по вертикали, размещенный элемент управления ComboBox не будет растягиваться как ожидается.
Элементы управления Windows Forms нельзя повернуть или изменить. Элемент WindowsFormsHost вызывает событие LayoutError при применении трансформации скоса или поворота. Если вы не обрабатываете событие LayoutError, вызывается InvalidOperationException.
В большинстве случаев элементы управления Windows Forms не поддерживают пропорциональное масштабирование. Хотя общие размеры элемента управления будут масштабироваться, дочерние элементы и компоненты элемента управления могут не менять размер как ожидалось. Это ограничение зависит от того, насколько хорошо каждый элемент управления Windows Forms поддерживает масштабирование. Кроме того, нельзя масштабировать элементы управления Windows Forms до размера 0 пикселей.
Элементы управления Windows Forms поддерживают автомасштабирование, в котором форма автоматически изменит размер и его элементы управления на основе размера шрифта. В пользовательском интерфейсе WPF изменение размера шрифта не изменяет размер всего макета, хотя отдельные элементы могут динамически изменять размер.
Z-порядок
В пользовательском интерфейсе WPF можно изменить порядок элементов для управления перекрывающимся поведением. Элемент управления Windows Forms размещен в отдельном HWND, поэтому он всегда отображается поверх элементов WPF.
Встроенный элемент управления Windows Forms также рисуется поверх любых элементов с меткой Adorner.
Поведение макета
В следующих разделах описываются конкретные аспекты поведения макета при размещении элементов управления Windows Forms в WPF.
Масштабирование, преобразование единиц и независимость устройств
Каждый раз, когда элемент WindowsFormsHost выполняет операции с измерениями WPF и Windows Forms, используются две системы координат: независимые от устройства пиксели для WPF и аппаратных пикселей для Windows Forms. Таким образом, необходимо применить надлежащие преобразования единиц и масштабирования для достижения согласованного макета.
Преобразование между системами координат зависит от текущего разрешения устройства и любых преобразований макета или отрисовки, применяемых к элементу WindowsFormsHost или к его предкам.
Если выходное устройство равно 96 dpi и масштабирование не было применено к элементу WindowsFormsHost, то один не зависящий от устройства пиксель равен одному аппаратному пикселю.
Во всех остальных случаях требуется масштабирование системы координат. Размещенный элемент управления не изменяет свой размер. Вместо этого элемент WindowsFormsHost пытается изменить размер размещенного управляющего элемента и всех его дочерних управляющих элементов. Так как Windows Forms не полностью поддерживает масштабирование, элемент WindowsFormsHost масштабируется до степени, поддерживаемой определенными элементами управления.
Переопределите метод ScaleChild, чтобы обеспечить пользовательское поведение масштабирования для размещенного элемента управления Windows Forms.
Помимо масштабирования элемент WindowsFormsHost обрабатывает округление и переполнение случаев, как описано в следующей таблице.
Проблема с преобразованием | Описание |
---|---|
Округление | Измерения пикселей, независимые от устройств WPF, указываются как double , а аппаратные измерения пикселей Windows Forms указаны как int . В случаях, когда измерения на основе double преобразуются в измерения на основе int , элемент WindowsFormsHost использует стандартное округление, чтобы дробные значения меньше 0,5 округлялись до 0. |
Переполнение | Если элемент WindowsFormsHost преобразуется из значений double в значения int , возможно переполнение. Значения, превышающие MaxValue, имеют значение MaxValue. |
Свойства, связанные с макетом
Свойства, управляющие поведением макета в элементах управления Windows Forms и элементами WPF, сопоставляются соответствующим образом элементом WindowsFormsHost. Дополнительные сведения см. в разделах ипо сопоставлению свойств Windows Forms и WPF.
Изменения макета в размещенном элементе управления
Изменения макета в размещенном элементе управления Windows Forms распространяются в WPF для активации обновлений макета. Метод InvalidateMeasure на WindowsFormsHost гарантирует, что изменения макета в размещенном элементе управления вызывают запуск обработчика макета WPF.
Элементы управления Windows Forms с динамически изменяемым размером
Элементы управления Windows Forms, поддерживающие непрерывное масштабирование, полностью взаимодействуют с системой макета WPF. Элемент WindowsFormsHost использует методы MeasureOverride и ArrangeOverride как обычно для размера и упорядочивания размещенного элемента управления Windows Forms.
Алгоритм определения размера
Элемент WindowsFormsHost использует следующую процедуру для размера размещенного элемента управления:
Элемент WindowsFormsHost переопределяет методы MeasureOverride и ArrangeOverride.
Чтобы определить размер размещенного элемента управления, метод MeasureOverride вызывает метод GetPreferredSize размещенного элемента управления с ограничением, преобразованным из ограничения, переданного методу MeasureOverride.
Метод ArrangeOverride пытается задать управляющему элементу заданные ограничения размера.
Если свойство Size элемента управления соответствует указанному ограничению, элемент управления изменяет размер в соответствии с ограничением.
Если свойство Size не соответствует указанному ограничению, размещенный элемент управления не поддерживает непрерывный размер. Например, элемент управления MonthCalendar разрешает только дискретные размеры. Допустимые размеры для этого элемента управления состоят из целых чисел (представляющих количество месяцев) для высоты и ширины. В таких случаях элемент WindowsFormsHost ведет себя следующим образом:
Если свойство Size возвращает размер больше, чем указанное ограничение, элемент WindowsFormsHost обрезает размещенный элемент управления. Высота и ширина обрабатываются отдельно, поэтому размещённый элемент управления может быть обрезан с любой стороны.
Если свойство Size возвращает меньший размер, чем указанное ограничение, WindowsFormsHost принимает это значение размера и возвращает значение в систему макета WPF.
См. также
.NET Desktop feedback