다음을 통해 공유


연습: 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 사용자 정의 컨트롤을 호스팅합니다.

다음 그림에서는 응용 프로그램의 모양을 보여 줍니다.

호스팅된 Windows Forms 컨트롤

참고

표시되는 대화 상자와 메뉴 명령은 활성 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 설정에 대한 작업을 참조하십시오.

사전 요구 사항

이 연습을 완료하려면 다음 구성 요소가 필요합니다.

  • Visual Studio 2010.

WPF 프로젝트 만들기

첫 번째 단계로 호스트 응용 프로그램에 대한 WPF 프로젝트를 만듭니다.

프로젝트를 만들려면

  1. Visual Basic 또는 Visual C#에서 HostingMonthCalendar라는 새 WPF 응용 프로그램 프로젝트를 만듭니다. 자세한 내용은 방법: 새 WPF 응용 프로그램 프로젝트 만들기를 참조하십시오.

    WPF Designer에 MainWindow.xaml이 열립니다.

  2. 솔루션 탐색기에서 WindowsFormsIntegration.dll이라는 WindowsFormsIntegration 어셈블리에 대한 참조를 추가합니다.

Windows Forms 복합 컨트롤 만들기

이 절차에서는 UserControl 클래스에서 형식을 파생하여 복합 컨트롤을 만드는 방법을 보여 줍니다.

Windows Forms 복합 컨트롤을 만들려면

  1. Visual Basic 또는 Visual C#에서 VendorControlLibrary라는 새 Windows Forms 컨트롤 라이브러리 프로젝트를 솔루션에 추가합니다. 자세한 내용은 방법: 솔루션 항목 추가 및 제거를 참조하십시오.

    Windows Forms 디자이너에서 UserControl1이 열립니다.

  2. 솔루션 탐색기에서 UserControl1 파일을 마우스 오른쪽 단추로 클릭한 다음 이름 바꾸기를 선택합니다.

  3. 컨트롤의 이름을 VendorControl로 바꿉니다. 모든 참조의 이름을 바꿀지 묻는 메시지가 나타나면 를 클릭합니다.

  4. 디자인 화면에서 VendorControl을 선택합니다.

  5. 속성 창에서 Size 속성 값을 200,200으로 설정합니다.

  6. 도구 상자에서 MonthCalendar 컨트롤을 두 번 클릭합니다.

    디자인 화면에 MonthCalendar 컨트롤이 나타납니다.

  7. 속성 창에서 MonthCalendar 컨트롤에 대해 다음 속성을 설정합니다.

    Property

    Margin

    0,0,0,0

    ShowToday

    False

  8. VendorControl의 크기를 MonthCalendar 컨트롤의 크기에 맞게 설정합니다.

  9. MonthCalendar 컨트롤을 선택합니다.

  10. 속성 창에서 이벤트 탭을 클릭하고 DateChanged 이벤트를 두 번 클릭합니다.

    코드 편집기에 VendorControl 파일이 열리고 DateChanged 이벤트의 이벤트 처리기가 추가됩니다.

  11. 기존 코드를 다음 코드로 바꿉니다. 이 코드는 Date 속성을 정의하고 MonthCalendar 컨트롤의 날짜 범위 속성인 SelectionStartSelectionEndTodayDate와 같은 값으로 제한하는 논리를 정의합니다. 또한 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
        }
    }
    
  12. 빌드 메뉴에서 솔루션 빌드를 선택하여 솔루션을 빌드합니다.

WPF에서 Windows Forms 컨트롤 호스팅

WPF 응용 프로그램에서 WindowsFormsHost 요소를 사용하여 VendorControl을 호스팅할 수 있습니다.

WPF에서 Windows Forms 컨트롤을 호스팅하려면

  1. 솔루션 탐색기의 HostingMonthCalendar 프로젝트에서 VendorControlLibrary project에 대한 참조를 추가합니다. 자세한 내용은 방법: Visual Studio에서 참조 추가 또는 제거를 참조하십시오.

  2. WPF Designer에서 MainWindow.xaml을 엽니다.

  3. 도구 상자에서 WindowsFormsHost 컨트롤을 디자인 화면으로 끌어 옵니다.

    WindowsFormsIntegration.dll이라는 어셈블리에 대한 참조가 HostingMonthCalendar 프로젝트에 추가됩니다.

  4. 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>
    
  5. 디버그 메뉴에서 디버깅 시작을 선택합니다.

  6. MonthCalendar 컨트롤을 클릭하여 현재 날짜를 변경합니다. WPF TextBlock 요소가 업데이트되어 선택한 날짜가 표시됩니다.

다음 단계

  • 컨트롤이 WPF 환경에서 광범위하게 사용되는 경우 WindowsFormsHost에서 클래스를 직접 파생하고 Date 속성을 노출할 수 있습니다. 이렇게 하면 다른 WPF 컨트롤에서 Path=Child.Date 구문을 사용하지 않고도 Date 속성에 직접 바인딩할 수 있습니다.

  • Windows Forms에서 WPF 컨트롤을 호스팅할 수도 있습니다. 자세한 내용은 WPF 컨트롤 사용을 참조하십시오.

참고 항목

작업

연습: WPF에서 Windows Forms 컨트롤 호스팅

참조

WindowsFormsHost

ElementHost

기타 리소스

WPF Designer에서의 컨트롤 작업

마이그레이션 및 상호 운용성

변경 기록

날짜

변경 내용

이유

2010년 9월

누락된 단계를 추가했습니다.

고객 의견