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


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

В этом примере показаны способы использования Конструктор 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

Примечание

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

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

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

  • Visual Studio 2010.

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

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

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

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

    Файл MainWindow.xaml будет открыт в сред. Конструктор WPF.

  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. Выберите элемент управления "VendorControl" на поверхности разработки.

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

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

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

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

    Свойство

    Значение

    Margin

    0,0,0,0

    ShowToday

    False

  8. Установите размер элемента управления "VendorControl" равным размеру элемента управления MonthCalendar.

  9. Выберите элемент управления MonthCalendar.

  10. В окне "Свойства" перейдите на вкладку "События" и дважды щелкните событие DateChanged.

    В редакторе кода откроется файл VendorControl, будет добавлен обработчик событий для события DateChanged.

  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.

  2. Откройте файл MainWindow.xaml в сред. Конструктор WPF.

  3. Перетащите элемент управления WindowsFormsHost из панели элементов на поверхность разработки.

    Ссылка на сборку WindowsFormsIntegration.dll будет добавлена в проект HostingMonthCalendar.

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

    <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 выполнить привязку непосредственно к свойству Date без использования синтаксиса Path=Child.Date.

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

См. также

Задачи

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

Ссылки

WindowsFormsHost

ElementHost

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

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

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

Журнал изменений

Дата

Журнал

Причина

сентябрь 2010 г.

Добавлен недостающий шаг.

Обратная связь от клиента.