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


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

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

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

Различия в макетах WPF и Windows Forms

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

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

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

Функция макета Description
Автоматическое изменение размера Некоторые элементы управления 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 обрабатывает случаи округления и переполнения как описано в следующей таблице.

Проблема с преобразованием Description
Округление Размеры независимых от устройства пикселей WPF, указываются как double, а размеры аппаратных пикселей Windows Forms указываются как int. В случаях, когда размеры на основе double преобразуются в размеры на основе int, элемент WindowsFormsHost использует стандартное округление, чтобы дробные значения менее 0,5 округлялись до 0.
Overflow Если элемент 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.

См. также