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


Вопросы, связанные с макетом элемента WindowsFormsHost

В этом разделе описывается то, как элемент WindowsFormsHost взаимодействует с системой макета WPF.

WPF и Windows Forms поддерживают разную, но похожую логику для изменения размера и размещения элементов на форме или странице. При создании гибридного пользовательского интерфейса (UI), содержащего элементы управления Windows Forms в WPF, элемент WindowsFormsHost объединяет две схемы макета.

Различия между макетами в WPF и Windows Forms

WPF использует макет, не зависящий от разрешения. Все измерения макета WPF задаются с помощью аппаратно-независимых точек. Аппаратно-независимая точка — это точка, размером в одну девяносто шестую дюйма, которая не зависит от разрешения. Поэтому можно получить одинаковые результаты независимо от того, отображается ли результат на мониторе с разрешением 72 точки на дюйм или на принтере с разрешением 19 200 точек на дюйм.

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 можно изменить z-порядок элементов для контроля поведения перекрывания. Вложенный элемент управления Windows Forms прорисовывается в отдельном HWND, причем он всегда прорисовывается поверх элементов WPF.

Вложенный элемент управления Windows Forms также отображается поверх любых элементов Adorner.

Поведение макета

В следующих разделах описываются определенные аспекты поведения макета при размещении элементов управления Windows Forms в WPF.

Масштабирование, пересчет единиц измерения и независимость от оборудования

Всякий раз, когда элемент WindowsFormsHost выполняет операции, связанные с измерениями WPF и Windows Forms, в этом участвуют две системы координат: аппаратно-независимые точки для WPF и аппаратно-зависимые точки для Windows Forms. Поэтому для получения единообразного макета необходимо применить соответствующий пересчет единиц измерения и преобразования масштабирования.

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

Если устройство вывода имеет разрешение 96 точек на дюйм и к элементу 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 использует следующую процедуру для изменения размера размещенного элемента управления:

  1. Элемент WindowsFormsHost переопределяет методы MeasureOverride и ArrangeOverride.

  2. Для определения размера размещенного элемента управления метод MeasureOverride вызывает метод GetPreferredSize размещенного элемента управления с ограничением, полученным от ограничения, переданного методу MeasureOverride.

  3. Метод ArrangeOverride пытается установить размещенный элемент управления в соответствии с ограничением заданного размера.

  4. Если свойство размещенного элемента управления Size соответствует указанным ограничениям, размеры размещаемого элемента управления изменяются в соответствии с ограничениями.

Если свойство Size не соответствует указанным ограничениям, размещаемый элемент управления не поддерживает постоянное изменение размера. Например, элемент управления MonthCalendar допускает только дискретные размеры. Разрешенные размеры для данного элемента управления состоят из целых чисел (представляющие номер месяца) для высоты и ширины. В подобных случаях элемент WindowsFormsHost ведет себя следующим образом:

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

  • Если свойство Size возвращает меньший размер, чем указанное ограничение, WindowsFormsHost принимает это значение размера и возвращает значение в систему макета WPF.

См. также

Задачи

Пошаговое руководство. Упорядочение элементов управления Windows Forms в приложении WPF

Ссылки

ElementHost

WindowsFormsHost

Основные понятия

Сопоставление свойств Windows Forms и WPF

Другие ресурсы

Arranging Windows Forms Controls in WPF Sample

Миграция и взаимодействие систем