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


Пошаговое руководство. Размещение стороннего элемента управления Windows Forms в приложении WPF

Обновлен: Ноябрь 2007

В этом примере показаны способы использования Windows Presentation Foundation (WPF) для Visual Studio (конструктор) для размещения элемента управления Windows Forms стороннего поставщика в приложении WPF. Дополнительные сведения о взаимодействии Windows Forms и WPF см. в разделе Миграция и взаимодействие систем.

В данном примере в качестве элемента управления стороннего поставщика используется элемент управления MonthCalendar. Создайте тип UserControl, имеющий экземпляр элемента управления MonthCalendar в своей коллекции Controls. Тип UserControl предоставляет свойство Date и реализует пользовательскую логику для определения поведения элемента управления MonthCalendar. В приложении WPF элемент TextBlock привязан к свойству Date.

В данном примере выполняются следующие задачи.

  • Создание проекта WPF.

  • Создание пользовательского элемента управления Windows Forms, который инкапсулирует элемент управления стороннего поставщика.

  • Размещение пользовательского элемента управления Windows Forms в приложении WPF.

На следующем рисунке показано, как будет выглядеть приложение.

Размещаемый элемент управления Windows Forms

Bb628679.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или версии среды. Для изменения параметров выберите пункт Импорт и экспорт параметров в меню Сервис. Дополнительные сведения см. в разделе Параметры Visual Studio.

Обязательные компоненты

Ниже приведены компоненты, которые необходимы для выполнения данного пошагового руководства.

  • Visual Studio 2008.

Создание проекта WPF

Первым этапом является создание проекта WPF для главного приложения.

Создание проекта

  1. Создайте новый проект приложения WPF на языке Visual Basic или Visual C# с именем HostingMonthCalendar. Дополнительные сведения см. в разделе Практическое руководство. Создание нового проекта приложения WPF.

    В WPF (конструктор) откроется файл Window1.xaml.

  2. В обозревателе решений добавьте ссылку на сборку WindowsFormsIntegration, которая называется WindowsFormsIntegration.dll.

Создание составного элемента управления Windows Forms

В этой процедуре показано, как создать составной элемент управления, наследуя тип от класса UserControl.

Создание составного элемента управления Windows Forms

  1. Добавьте к решению новый проект библиотеки элементов управления Windows Forms на языке Visual Basic или Visual C# с именем VendorControlLibrary. Дополнительные сведения см. в разделе Практическое руководство. Добавление и удаление элементов решения.

    В конструкторе Windows Forms Designer открывается элемент управления UserControl1

  2. В обозревателя решений щелкните правой кнопкой мыши файл UserControl1 и выберите Переименовать.

  3. Измените имя этого элемента управления на VendorControl. При появлении запроса на подтверждение переименования всех ссылок нажмите кнопку Да.

  4. В конструкторе Windows Forms Designer откройте элемент управления «VendorControl».

  5. Выберите элемент управления «VendorControl» на поверхности разработки.

  6. В окне Свойства присвойте свойству Size значение 200,200.

  7. В Панели элементов дважды щелкните элемент управления MonthCalendar.

    Элемент управления MonthCalendar отображается на поверхности разработки.

  8. В окне Свойства установите следующие свойства для элемента управления MonthCalendar:

    Свойство

    Значение

    Margin

    0,0,0,0

    ShowToday

    False:

  9. В конструкторе Windows Forms Designer установите размер элемента управления «VendorControl» равным размеру элемента управления MonthCalendar.

  10. Откройте файл VendorControl в редакторе кода.

  11. Замените существующий код следующим кодом. Этот код определяет свойство Date и логику ограничения свойств диапазона даты SelectionStart и SelectionEnd элемента управления MonthCalendar значением свойства TodayDate. Этот код также реализует интерфейс INotifyPropertyChanged, который используется в привязке данных WPF.

    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. В меню Построить выберите команду Построить решение для сборки решения.

Размещение элемента управления Windows Forms в WPF

Для размещения элемента управления «VendorControl» в приложении WPF используйте элемент WindowsFormsHost.

Размещение элемента управления Windows Forms в WPF

  1. В проекте HostingMonthCalendar обозревателя решений добавьте ссылку на проект VendorControlLibrary. Дополнительные сведения см. в разделе Практическое руководство. Добавление или удаление ссылок в Visual Studio (Visual Basic).

  2. Откройте файл Window1.xaml в WPF (конструктор).

  3. В представлении XAML замените существующую разметку на следующую. В этом коде XAML сопоставляется пространство имен VendorControlLibrary, создается элемент WindowsFormsHost и привязывается элемент TextBlock к свойству Date элемента управления VendorControl.

    <Window x:Class="HostingMonthCalendar.Window1"
        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>
    
    <Window x:Class="HostingMonthCalendar.Window1"
        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>
    

    В конструкторе появится область, представляющая размещенные элементы управления Windows Forms. Если элемент управления не отображается, откройте вкладку Конструктор, чтобы перейти в представление конструктора.

  4. В меню Отладка выберите команду Начать отладку.

  5. Щелкните элемент управления MonthCalendar для изменения текущей даты. Элемент WPF TextBlock обновляется — отображается выбранная дата.

Следующие действия

  • Если элемент управления будет широко использоваться в среде WPF, можно создать собственный производный класс от класса WindowsFormsHost и предоставить свойство Date. Это позволит другим элементам управления WPF выполнить привязку непосредственно к свойству Date без использования синтаксиса Path=Child.Date.

  • Можно также размещать элементы управления WPF в формах Windows Forms. Дополнительные сведения см. в разделе Использование элементов управления Windows Presentation Foundation.

См. также

Задачи

Пошаговое руководство. Размещение элемента управления Windows Forms в Windows Presentation Foundation

Ссылки

WindowsFormsHost

ElementHost

Другие ресурсы

Работа с элементами управления в конструкторе WPF

Миграция и взаимодействие систем