WPF 및 Windows Forms 상호 운용성
WPF 및 Windows Forms에서는 애플리케이션 인터페이스를 만들기 위한 두 개의 서로 다른 아키텍처를 제공합니다. System.Windows.Forms.Integration 네임스페이스는 일반적인 상호 운용성 시나리오를 지원하는 클래스를 제공합니다. 상호 운용성 기능을 구현 하는 두 가지 주요 클래스는 WindowsFormsHost 고 ElementHost입니다. 이 항목에서는 지원되는 상호 운용성 시나리오와 지원되지 않는 시나리오를 설명합니다.
참고
하이브리드 컨트롤 시나리오에는 특별 고려 사항이 제공됩니다. 하이브리드 컨트롤에서는 한 기술의 컨트롤이 다른 기술의 컨트롤에 중첩되어 있습니다. 이 특징은 중첩된 상호 운용성이라고도 합니다. 다단계 하이브리드 컨트롤에는 두 개 이상의 하이브리드 컨트롤 중첩 수준이 있습니다. 다단계 중첩 상호 운용성의 예는 WPF 컨트롤이 포함되어 있는 Windows Forms 컨트롤로, 여기에는 다른 Windows Forms 컨트롤이 포함됩니다. 다단계 하이브리드 컨트롤은 지원되지 않습니다.
WPF에서 Windows Forms 컨트롤 호스팅
다음 상호 운용성 시나리오는 WPF 컨트롤에서 Windows Forms 컨트롤을 호스팅할 때 지원됩니다.
WPF 컨트롤은 XAML을 사용하여 하나 이상의 Windows Forms 컨트롤을 호스트할 수 있습니다.
코드를 사용하여 하나 이상의 Windows Forms 컨트롤을 호스트할 수 있습니다.
다른 Windows Forms 컨트롤을 포함하는 Windows Forms 컨테이너 컨트롤을 호스트할 수 있습니다.
WPF 마스터와 Windows Forms 세부 정보가 포함된 마스터/세부 정보 양식을 호스트할 수 있습니다.
Windows Forms 마스터와 WPF 세부 정보가 포함된 마스터/세부 정보 양식을 호스트할 수 있습니다.
하나 이상의 ActiveX 컨트롤을 호스팅할 수 있습니다.
하나 이상의 복합 컨트롤을 호스팅할 수 있습니다.
XAML(Extensible Application Markup Language)을 사용하는 하이브리드 컨트롤을 호스트할 수 있습니다.
코드를 사용하여 하이브리드 컨트롤을 호스팅할 수 있습니다.
레이아웃 지원
다음 목록에서는 WindowsFormsHost 요소가 호스팅된 Windows Forms 컨트롤을 WPF 레이아웃 시스템에 통합하려고 할 때 알려진 제한 사항을 설명합니다.
경우에 따라 Windows Forms 컨트롤은 크기를 조정할 수 없거나 특정 차원으로만 크기를 조정할 수 있습니다. 예를 들어, Windows Forms ComboBox 컨트롤은 컨트롤의 글꼴 크기로 정의된 단일 높이만 지원합니다. 요소가 세로로 확장될 수 있다고 가정하는 WPF 동적 레이아웃에서 호스팅된 ComboBox 컨트롤은 예상대로 확장되지 않습니다.
Windows Forms 컨트롤을 회전하거나 기울일 수 없습니다. 예를 들어, 사용자 인터페이스를 90도 회전하면 호스팅된 Windows Forms 컨트롤이 수직 위치를 유지합니다.
대부분의 경우 Windows Forms 컨트롤에서는 비례하여 크기 조정을 지원하지 않습니다. 컨트롤의 전체 크기는 조정할 수 있지만, 컨트롤의 구성 요소와 자식 컨트롤의 크기가 예상대로 조정되지 않을 수 있습니다. 이 제한 사항은 각 Windows Forms 컨트롤에서 얼마나 효과적으로 크기 조정을 지원하는지에 따라 달라집니다.
WPF 사용자 인터페이스에서 겹치는 동작을 제어하기 위해 요소의 z 순서를 변경할 수 있습니다. 호스트된 Windows Forms 컨트롤은 개별 HWND에서 그려지므로 항상 WPF 요소 위에 그려집니다.
Windows Forms 컨트롤은 컨트롤 크기에 따라 자동 크기 조정을 지원합니다. 개별 요소의 크기는 동적으로 조정할 수 있지만 WPF 사용자 인터페이스에서 글꼴 크기를 변경해도 전체 레이아웃의 크기는 조정되지 않습니다.
앰비언트 속성
WPF 컨트롤의 일부 앰비언트 속성에는 상응하는 Windows Forms가 있습니다. 이러한 앰비언트 속성은 호스트된 Windows Forms 컨트롤로 전파되어 WindowsFormsHost 컨트롤에 공개 속성으로 노출됩니다. WindowsFormsHost 컨트롤은 각 WPF 앰비언트 속성을 상응하는 Windows Forms로 변환합니다.
자세한 내용은 Windows Forms 및 WPF 속성 매핑을 참조하세요.
동작
다음 테이블에서는 상호 운용성 동작을 설명합니다.
동작 | 지원됨 | 지원되지 않음 |
---|---|---|
투명성 | Windows Forms 컨트롤 렌더링에서는 투명도를 지원합니다. 부모 WPF 컨트롤의 배경이 호스팅된 Windows Forms 컨트롤의 배경이 될 수 있습니다. | 일부 Windows Forms 컨트롤은 투명성을 지원하지 않습니다. 예를 들어 WPF에서 호스트할 경우 TextBox 및 ComboBox 컨트롤은 투명하지 않습니다. |
탭 이동 | 호스팅된 Windows Forms 컨트롤의 탭 순서는 기반 애플리케이션에서 해당 컨트롤을 호스팅할 때와 동일합니다. Tab 키와 Shift+Tab을 사용하여 WPF 컨트롤에서 컨트롤로 탭을 이동하는 기능은 정상적으로 작동합니다. 사용자가 컨트롤을 통해 탭을 이동할 때 TabStop 특성 값이 false 인 Windows Forms 컨트롤이 포커스를 받지 못합니다.- 각 WindowsFormsHost 컨트롤에는 TabIndex 값이 있으며, 이는 WindowsFormsHost 컨트롤이 포커스를 받을 시점을 결정합니다. - WindowsFormsHost 컨테이너 내부에 포함된 Windows Forms 컨트롤은 TabIndex 속성에 의해 지정된 순서를 따릅니다. 마지막 탭 인덱스에서 탭 이동하면 다음 WPF 컨트롤(있는 경우)에 포커스를 둡니다. 기타 포커스 가능 WPF 컨트롤이 없으면, 탭 순서에서 첫 번째에 있는 Windows Forms 컨트롤에 탭 이동이 반환됩니다. - WindowsFormsHost 내부의 컨트롤에 대한 TabIndex 값은 WindowsFormsHost 컨트롤에 포함된 유사한 Windows Forms 컨트롤에 상대적입니다 - 탭 이동은 컨트롤별 동작을 준수합니다. 예를 들어 AcceptsTab 속성 값이 true 인 TextBox에서 TAB 키를 누르면 포커스가 이동하는 대신 텍스트 상자에 탭이 입력됩니다. |
해당 사항 없음 |
화살표 키를 사용하여 탐색 | - WindowsFormsHost 컨트롤에서 화살표 키를 사용하여 탐색하는 것은 일반적인 Windows Forms 컨테이너 컨트롤과 같습니다. 위쪽 화살표와 왼쪽 화살표 키는 이전 컨트롤을 선택하고, 아래쪽 화살표와 오른쪽 화살표 키는 다음 컨트롤을 선택합니다. - WindowsFormsHost 컨트롤에 포함된 첫 번째 컨트롤의 위쪽 화살표 및 왼쪽 화살표 키는 Shift+Tab 바로 가기 키와 동일한 작업을 수행합니다. 포커스 가능한 WPF 컨트롤이 있는 경우 포커스가 WindowsFormsHost 컨트롤 외부로 움직입니다. 이 동작은 마지막 컨트롤에 대한 래핑이 발생하지 않는 표준 ContainerControl 동작과 다릅니다. 기타 포커스 가능 WPF 컨트롤이 없으면, 탭 순서에서 마지막 Windows Forms 컨트롤에 포커스가 반환됩니다. - WindowsFormsHost 컨트롤에 포함된 마지막 컨트롤의 아래쪽 화살표와 오른쪽 화살표가 TAB 키와 동일한 동작을 수행합니다. 포커스 가능한 WPF 컨트롤이 있는 경우 포커스가 WindowsFormsHost 컨트롤 외부로 움직입니다. 이 동작은 첫 번째 컨트롤에 대한 래핑이 발생하지 않는 표준 ContainerControl 동작과 다릅니다. 기타 포커스 가능 WPF 컨트롤이 없으면, 탭 순서에서 첫 번째에 있는 Windows Forms 컨트롤에 포커스가 반환됩니다. |
해당 사항 없음 |
액셀러레이터 | “지원되지 않음” 열에 명시된 경우를 제외하고는 액셀러레이터가 정상적으로 작동합니다. | 기술 전체에서 중복된 액셀러레이터는 일반 중복 액셀러레이터처럼 작동하지 않습니다. 액셀러레이터가 기술 전체에 걸쳐 중복되어 있어, 하나 이상이 Windows Forms 컨트롤에 있고 다른 하나는 WPF 컨트롤에 있으면 Windows Forms 컨트롤에서 항상 액셀러레이터를 받습니다. 중복 액셀러레이터를 누르면 컨트롤 간에 포커스가 전환되지 않습니다. |
바로 가기 키 | “지원되지 않음” 열에 명시된 경우를 제외하고는 바로 가기 키가 정상적으로 작동합니다. | - 전처리 단계에서 처리하는 Windows Forms 바로 가기 키는 항상 WPF 바로 가기 키보다 우선합니다. 예를 들어 CTRL+S 바로 가기 키가 정의된 ToolStrip 컨트롤이 있고 CTRL+S에 바인드된 WPF 명령이 있는 경우 포커스에 관계없이 ToolStrip 컨트롤 처리기가 항상 먼저 호출됩니다. - KeyDown 이벤트에 의해 처리되는 Windows Forms 바로 가기 키는 WPF에서 마지막으로 처리됩니다. Windows Forms 컨트롤의 IsInputKey 메서드를 재정의하거나 PreviewKeyDown 이벤트를 처리하여 이 동작을 방지할 수 있습니다. IsInputKey 메서드에서 true 를 반환하거나 PreviewKeyDown 이벤트 처리기에서 PreviewKeyDownEventArgs.IsInputKey 속성 값을 true 로 설정합니다. |
AcceptsReturn, AcceptsTab 및 기타 컨트롤별 동작 | Windows Forms 컨트롤이 true 를 반환하도록 IsInputKey 메서드를 재정의하면 기본 키보드 동작을 변경하는 속성이 정상적으로 작동합니다. |
KeyDown 이벤트를 처리하여 기본 키보드 동작을 변경하는 Windows Forms 컨트롤은 호스트 WPF 컨트롤에서 마지막으로 처리됩니다. 이러한 컨트롤은 마지막으로 처리되므로 예기치 않은 동작이 발생할 수 있습니다. |
시작 및 종료 이벤트 | 포커스가 ElementHost 컨트롤을 포함하지 않을 경우 포커스가 단일 WindowsFormsHost 컨트롤에서 변경되면 시작 및 종료 이벤트가 평소대로 발생합니다. | 다음 포커스 변경이 발생하면 시작 및 종료 이벤트는 발생하지 않습니다. - WindowsFormsHost 컨트롤 안쪽에서 바깥쪽으로. - WindowsFormsHost 컨트롤 바깥쪽에서 안쪽으로. - WindowsFormsHost 컨트롤 바깥쪽. - WindowsFormsHost 컨트롤에서 호스트되는 Windows Forms 컨트롤에서 동일한 WindowsFormsHost 내에서 호스트되는 ElementHost 컨트롤로. |
다중 스레딩 | 모든 종류의 다중 스레딩이 지원됩니다. | Windows Forms와 WPF 기술은 모두 단일 스레드 동시성 모델을 가정합니다. 디버깅 중에 다른 스레드에서 프레임워크 개체를 호출하면 이 요구 사항을 적용하기 위해 예외가 발생합니다. |
보안 | 모든 상호 운용성 시나리오에는 완전 신뢰가 필요합니다. | 부분 신뢰에서는 상호 운용성 시나리오가 허용되지 않습니다. |
내게 필요한 옵션 | 모든 접근성 시나리오가 지원됩니다. Windows Forms와 WPF 컨트롤이 모두 포함된 하이브리드 애플리케이션에 사용될 때 보조 기술 제품이 올바르게 작동합니다. | 해당 사항 없음 |
클립보드 | 모든 클립보드 작업이 정상적으로 작동합니다. 여기에는 Windows Forms와 WPF 컨트롤 간의 자르기와 붙이기가 포함됩니다. | 해당 사항 없음 |
끌어서 놓기 기능 | 끌어서 놓기 작업이 모두 정상적으로 작동합니다. 여기에는 Windows Forms 및 WPF 컨트롤 간의 작업이 포함됩니다. | 해당 사항 없음 |
Windows Forms에서 WPF 컨트롤 호스팅
다음 상호 운용성 시나리오는 Windows Forms 컨트롤에서 WPF 컨트롤을 호스팅할 때 지원됩니다.
코드를 사용하여 하나 이상의 WPF 컨트롤 호스팅.
속성 시트를 호스팅된 하나 이상의 WPF 컨트롤과 연결.
양식에서 하나 이상의 WPF 페이지 호스팅.
WPF 창 시작.
Windows Forms 마스터와 WPF 세부 정보가 포함된 마스터/세부 정보 양식 호스팅.
WPF 마스터와 Windows Forms 세부 정보가 포함된 마스터/세부 정보 양식 호스팅.
사용자 지정 WPF 컨트롤 호스팅.
하이브리드 컨트롤 호스팅.
앰비언트 속성
Windows Forms 컨트롤의 일부 앰비언트 속성에는 상응하는 WPF가 있습니다. 이러한 앰비언트 속성은 호스트된 WPF 컨트롤로 전파되어 ElementHost 컨트롤에 공개 속성으로 노출됩니다. ElementHost 컨트롤은 각 Windows Forms 앰비언트 속성을 상응하는 WPF로 변환합니다.
자세한 내용은 Windows Forms 및 WPF 속성 매핑을 참조하세요.
동작
다음 테이블에서는 상호 운용성 동작을 설명합니다.
동작 | 지원됨 | 지원되지 않음 |
---|---|---|
투명성 | WPF 컨트롤 렌더링에서는 투명도를 지원합니다. 부모 Windows Forms 컨트롤의 배경이 호스팅된 WPF 컨트롤의 배경이 될 수 있습니다. | 해당 사항 없음 |
다중 스레딩 | 모든 종류의 다중 스레딩이 지원됩니다. | Windows Forms와 WPF 기술은 모두 단일 스레드 동시성 모델을 가정합니다. 디버깅 중에 다른 스레드에서 프레임워크 개체를 호출하면 이 요구 사항을 적용하기 위해 예외가 발생합니다. |
보안 | 모든 상호 운용성 시나리오에는 완전 신뢰가 필요합니다. | 부분 신뢰에서는 상호 운용성 시나리오가 허용되지 않습니다. |
내게 필요한 옵션 | 모든 접근성 시나리오가 지원됩니다. Windows Forms와 WPF 컨트롤이 모두 포함된 하이브리드 애플리케이션에 사용될 때 보조 기술 제품이 올바르게 작동합니다. | 해당 사항 없음 |
클립보드 | 모든 클립보드 작업이 정상적으로 작동합니다. 여기에는 Windows Forms와 WPF 컨트롤 간의 자르기와 붙이기가 포함됩니다. | 해당 사항 없음 |
끌어서 놓기 기능 | 끌어서 놓기 작업이 모두 정상적으로 작동합니다. 여기에는 Windows Forms 및 WPF 컨트롤 간의 작업이 포함됩니다. | 해당 사항 없음. |
참조
.NET Desktop feedback