연습: WPF 응용 프로그램에서 타사 Windows Forms 컨트롤 호스팅
업데이트: 2010년 9월
이 연습에서는 WPF Designer for Visual Studio를 사용하여 WPF 응용 프로그램에서 Windows Forms 타사 공급업체 컨트롤을 호스팅하는 방법을 보여 줍니다. Windows Forms 및 WPF의 상호 운용성에 대한 자세한 내용은 마이그레이션 및 상호 운용성을 참조하십시오.
이 연습에서는 MonthCalendar 컨트롤을 사용하여 타사 공급업체 컨트롤을 나타냅니다. 해당 Controls 컬렉션에 MonthCalendar 컨트롤의 인스턴스가 있는 UserControl 형식을 만듭니다. UserControl 형식은 Date 속성을 노출하고 사용자 지정 논리를 구현하여 MonthCalendar 컨트롤의 동작을 정의합니다. WPF 응용 프로그램에서는 TextBlock 요소가 Date 속성에 바인딩됩니다.
이 연습에서는 다음 작업을 수행합니다.
WPF 프로젝트를 만듭니다.
공급업체 컨트롤을 캡슐화할 Windows Forms 사용자 정의 컨트롤을 만듭니다.
WPF 응용 프로그램에서 Windows Forms 사용자 정의 컨트롤을 호스팅합니다.
다음 그림에서는 응용 프로그램의 모양을 보여 줍니다.
참고
표시되는 대화 상자와 메뉴 명령은 활성 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 설정에 대한 작업을 참조하십시오.
사전 요구 사항
이 연습을 완료하려면 다음 구성 요소가 필요합니다.
- Visual Studio 2010.
WPF 프로젝트 만들기
첫 번째 단계로 호스트 응용 프로그램에 대한 WPF 프로젝트를 만듭니다.
프로젝트를 만들려면
Visual Basic 또는 Visual C#에서 HostingMonthCalendar라는 새 WPF 응용 프로그램 프로젝트를 만듭니다. 자세한 내용은 방법: 새 WPF 응용 프로그램 프로젝트 만들기를 참조하십시오.
WPF Designer에 MainWindow.xaml이 열립니다.
솔루션 탐색기에서 WindowsFormsIntegration.dll이라는 WindowsFormsIntegration 어셈블리에 대한 참조를 추가합니다.
Windows Forms 복합 컨트롤 만들기
이 절차에서는 UserControl 클래스에서 형식을 파생하여 복합 컨트롤을 만드는 방법을 보여 줍니다.
Windows Forms 복합 컨트롤을 만들려면
Visual Basic 또는 Visual C#에서 VendorControlLibrary라는 새 Windows Forms 컨트롤 라이브러리 프로젝트를 솔루션에 추가합니다. 자세한 내용은 방법: 솔루션 항목 추가 및 제거를 참조하십시오.
Windows Forms 디자이너에서 UserControl1이 열립니다.
솔루션 탐색기에서 UserControl1 파일을 마우스 오른쪽 단추로 클릭한 다음 이름 바꾸기를 선택합니다.
컨트롤의 이름을 VendorControl로 바꿉니다. 모든 참조의 이름을 바꿀지 묻는 메시지가 나타나면 예를 클릭합니다.
디자인 화면에서 VendorControl을 선택합니다.
속성 창에서 Size 속성 값을 200,200으로 설정합니다.
도구 상자에서 MonthCalendar 컨트롤을 두 번 클릭합니다.
디자인 화면에 MonthCalendar 컨트롤이 나타납니다.
속성 창에서 MonthCalendar 컨트롤에 대해 다음 속성을 설정합니다.
Property
값
Margin
0,0,0,0
ShowToday
False
VendorControl의 크기를 MonthCalendar 컨트롤의 크기에 맞게 설정합니다.
MonthCalendar 컨트롤을 선택합니다.
속성 창에서 이벤트 탭을 클릭하고 DateChanged 이벤트를 두 번 클릭합니다.
코드 편집기에 VendorControl 파일이 열리고 DateChanged 이벤트의 이벤트 처리기가 추가됩니다.
기존 코드를 다음 코드로 바꿉니다. 이 코드는 Date 속성을 정의하고 MonthCalendar 컨트롤의 날짜 범위 속성인 SelectionStart 및 SelectionEnd를 TodayDate와 같은 값으로 제한하는 논리를 정의합니다. 또한 WPF 데이터 바인딩에 사용되는 INotifyPropertyChanged 인터페이스를 구현합니다.
Imports System Imports System.Collections.Generic Imports System.ComponentModel Imports System.Drawing Imports System.Data Imports System.Linq Imports System.Text Imports System.Windows.Forms Public Class VendorControl Inherits UserControl Implements INotifyPropertyChanged <Browsable(True)> _ Public Property [Date]() As String Get Return Me.MonthCalendar1.TodayDate.ToShortDateString() End Get Set(ByVal value As String) If value <> Me.MonthCalendar1.TodayDate.ToShortDateString() Then Dim newDate As DateTime = DateTime.Parse(value) Me.SetDate(newDate) Me.NotifyPropertyChanged("Date") End If End Set End Property Private Sub monthCalendar1_DateChanged( _ ByVal sender As Object, ByVal e As DateRangeEventArgs) _ Handles MonthCalendar1.DateChanged Me.SetDate(e.Start) Me.NotifyPropertyChanged("Date") End Sub Private Sub SetDate(ByVal [date] As DateTime) Me.MonthCalendar1.TodayDate = [date] Me.MonthCalendar1.SelectionStart = [date] Me.MonthCalendar1.SelectionEnd = [date] End Sub #Region "INotifyPropertyChanged Implementation" Public Event PropertyChanged As PropertyChangedEventHandler _ Implements INotifyPropertyChanged.PropertyChanged Private Sub NotifyPropertyChanged(ByVal info As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info)) End Sub #End Region End Class
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace VendorControlLibrary { public partial class VendorControl : UserControl, INotifyPropertyChanged { public VendorControl() { InitializeComponent(); } [Browsable(true)] public string Date { get { return this.monthCalendar1.TodayDate.ToShortDateString(); } set { if (value != this.monthCalendar1.TodayDate.ToShortDateString()) { DateTime newDate = DateTime.Parse(value); this.SetDate(newDate); this.OnPropertyChanged("Date"); } } } private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) { this.SetDate(e.Start); this.OnPropertyChanged("Date"); } private void SetDate(DateTime date) { this.monthCalendar1.TodayDate = date; this.monthCalendar1.SelectionStart = date; this.monthCalendar1.SelectionEnd = date; } #region INotifyPropertyChanged Implementation public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion } }
빌드 메뉴에서 솔루션 빌드를 선택하여 솔루션을 빌드합니다.
WPF에서 Windows Forms 컨트롤 호스팅
WPF 응용 프로그램에서 WindowsFormsHost 요소를 사용하여 VendorControl을 호스팅할 수 있습니다.
WPF에서 Windows Forms 컨트롤을 호스팅하려면
솔루션 탐색기의 HostingMonthCalendar 프로젝트에서 VendorControlLibrary project에 대한 참조를 추가합니다. 자세한 내용은 방법: Visual Studio에서 참조 추가 또는 제거를 참조하십시오.
WPF Designer에서 MainWindow.xaml을 엽니다.
도구 상자에서 WindowsFormsHost 컨트롤을 디자인 화면으로 끌어 옵니다.
WindowsFormsIntegration.dll이라는 어셈블리에 대한 참조가 HostingMonthCalendar 프로젝트에 추가됩니다.
XAML 뷰에서 기존 태그를 다음 태그로 바꿉니다. 이 XAML은 VendorControlLibrary 네임스페이스를 매핑하고 TextBlock 요소를 VendorControl의 Date 속성에 바인딩합니다.
<Window x:Class="HostingMonthCalendar.MainWindow" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:v="clr-namespace:VendorControlLibrary;assembly=VendorControlLibrary" Title="Window1" Height="300" Width="300"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <WindowsFormsHost Name="Host" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"> <v:VendorControl Date="2/2/03" /> </WindowsFormsHost> <TextBlock Grid.Row="1" Text="{Binding ElementName=Host, Path=Child.Date, Mode=OneWay, UpdateSourceTrigger=PropertyChanged }" HorizontalAlignment="Stretch" VerticalAlignment="Center" TextAlignment="Center" TextDecorations="None" FontSize="24" /> </Grid> </Window>
디버그 메뉴에서 디버깅 시작을 선택합니다.
MonthCalendar 컨트롤을 클릭하여 현재 날짜를 변경합니다. WPF TextBlock 요소가 업데이트되어 선택한 날짜가 표시됩니다.
다음 단계
컨트롤이 WPF 환경에서 광범위하게 사용되는 경우 WindowsFormsHost에서 클래스를 직접 파생하고 Date 속성을 노출할 수 있습니다. 이렇게 하면 다른 WPF 컨트롤에서 Path=Child.Date 구문을 사용하지 않고도 Date 속성에 직접 바인딩할 수 있습니다.
Windows Forms에서 WPF 컨트롤을 호스팅할 수도 있습니다. 자세한 내용은 WPF 컨트롤 사용을 참조하십시오.
참고 항목
작업
연습: WPF에서 Windows Forms 컨트롤 호스팅
참조
기타 리소스
변경 기록
날짜 |
변경 내용 |
이유 |
---|---|---|
2010년 9월 |
누락된 단계를 추가했습니다. |
고객 의견 |