다음을 통해 공유


WindowsFormsHost 요소에 대한 레이아웃 고려 사항

이 항목에서는 WindowsFormsHost 요소가 WPF 레이아웃 시스템과 상호 작용하는 방법을 설명합니다.

WPF 및 Windows Forms는 양식 또는 페이지에서 요소의 크기를 조정하고 위치를 지정하기 위해 서로 다르지만 유사한 논리를 지원합니다. WPF에서 Windows Forms 컨트롤을 호스트하는 하이브리드 UI(사용자 인터페이스)를 만들 때 WindowsFormsHost 요소는 두 레이아웃 구성표를 통합합니다.

WPF와 Windows Forms 간의 레이아웃 차이점

WPF는 해상도 독립적 레이아웃을 사용합니다. 모든 WPF 레이아웃 차원은 디바이스 독립형 픽셀을 사용하여 지정됩니다. 디바이스 독립형 픽셀은 크기와 해상도에 관계없이 96분의 1인치이므로 72dpi 모니터 또는 19,200dpi 프린터로 렌더링하는 경우에도 비슷한 결과를 얻을 수 있습니다.

또한 WPF는 동적 레이아웃을 기반으로 합니다. 즉, UI 요소는 콘텐츠, 부모 레이아웃 컨테이너 및 사용 가능한 화면 크기에 따라 폼이나 페이지에 정렬됩니다. 동적 레이아웃은 포함된 문자열이 길이를 변경할 때 UI 요소의 크기와 위치를 자동으로 조정하여 지역화를 용이하게 합니다.

Windows Forms의 레이아웃은 디바이스에 따라 다르며 정적일 가능성이 높습니다. 일반적으로 Windows Forms 컨트롤은 하드웨어 픽셀에 지정된 차원을 사용하여 폼에 절대적으로 배치됩니다. 그러나 Windows Forms는 다음 표에 요약된 대로 일부 동적 레이아웃 기능을 지원합니다.

레이아웃 기능 설명
자동 크기 조정 일부 Windows Forms 컨트롤은 콘텐츠를 제대로 표시하기 위해 자체 크기를 조정합니다. 자세한 내용은 AutoSize 속성 개요를 참조하세요.
고정 및 도킹 Windows Forms 컨트롤은 부모 컨테이너에 따라 위치 지정 및 크기 조정을 지원합니다. 자세한 내용은 Control.AnchorControl.Dock를 참조하세요.
자동 확장 컨테이너 컨트롤은 출력 디바이스의 해상도 또는 기본 컨테이너 글꼴의 크기(픽셀)에 따라 자신과 자식의 크기를 조정합니다. 자세한 내용은 Windows Forms의 자동 크기 조정을 참조하세요.
레이아웃 컨테이너 FlowLayoutPanelTableLayoutPanel 컨트롤은 자식 컨트롤을 정렬하고 내용에 따라 크기를 조정합니다.

레이아웃 제한 사항

일반적으로 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 요소 위에 그려집니다.

레이아웃 동작

다음 섹션에서는 WPF에서 Windows Forms 컨트롤을 호스팅할 때 레이아웃 동작의 특정 측면에 대해 설명합니다.

크기 조정, 단위 변환 및 디바이스 독립성

WindowsFormsHost 요소가 WPF 및 Windows Forms 차원과 관련된 작업을 수행할 때마다 WPF용 디바이스 독립형 픽셀과 Windows Forms용 하드웨어 픽셀이라는 두 개의 좌표계가 관련됩니다. 따라서 일관된 레이아웃을 달성하려면 적절한 단위 및 크기 조정 변환을 적용해야 합니다.

좌표계 간의 변환은 현재 디바이스 해상도와 WindowsFormsHost 요소 또는 해당 상위 항목에 적용된 레이아웃 또는 렌더링 변환에 따라 달라집니다.

출력 디바이스가 96dpi이고 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로 전파되어 레이아웃 업데이트를 트리거합니다. WindowsFormsHostInvalidateMeasure 메서드는 호스트된 컨트롤의 레이아웃 변경으로 인해 WPF 레이아웃 엔진이 실행되도록 합니다.

지속적으로 크기가 조정되는 Windows Forms 컨트롤

지속적인 크기 조정을 지원하는 Windows Forms 컨트롤은 WPF 레이아웃 시스템과 완전히 상호 작용합니다. WindowsFormsHost 요소는 일반적으로 MeasureOverrideArrangeOverride 메서드를 사용하여 호스트된 Windows Forms 컨트롤의 크기를 조정하고 정렬합니다.

크기 조정 알고리즘

WindowsFormsHost 요소는 다음 절차를 사용하여 호스트된 컨트롤의 크기를 조정합니다.

  1. WindowsFormsHost 요소는 MeasureOverrideArrangeOverride 메서드를 재정의합니다.

  2. 호스트된 컨트롤의 크기를 결정하기 위해 MeasureOverride 메서드는 GetPreferredSize 메서드에 전달된 제약 조건에서 변환된 제약 조건을 사용하여 호스트된 컨트롤의 MeasureOverride 메서드를 호출합니다.

  3. ArrangeOverride 메서드는 호스트된 컨트롤을 지정된 크기 제약 조건으로 설정하려고 시도합니다.

  4. 호스트된 컨트롤의 Size 속성이 지정된 제약 조건과 일치하면 호스트된 컨트롤의 크기가 제약 조건에 맞게 조정됩니다.

Size 속성이 지정된 제약 조건과 일치하지 않으면 호스트된 컨트롤은 연속 크기 조정을 지원하지 않습니다. 예를 들어 MonthCalendar 컨트롤은 불연속 크기만 허용합니다. 이 컨트롤에 허용되는 크기는 높이와 너비 모두에 대한 정수(월 수를 나타냄)로 구성됩니다. 이와 같은 경우 WindowsFormsHost 요소는 다음과 같이 작동합니다.

  • Size 속성이 지정된 제약 조건보다 큰 크기를 반환하면 WindowsFormsHost 요소가 호스트된 컨트롤을 클리핑합니다. 높이와 너비는 개별적으로 처리되므로 호스트된 컨트롤이 어느 방향으로든 잘릴 수 있습니다.

  • Size 속성이 지정된 제약 조건보다 작은 크기를 반환하는 경우 WindowsFormsHost는 이 크기 값을 수락하고 WPF 레이아웃 시스템에 반환합니다.

참고 항목