Пошаговое руководство. Размещение стороннего элемента управления 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.
На следующем рисунке показано, как будет выглядеть приложение.
Примечание. |
---|
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или версии среды. Для изменения параметров выберите пункт Импорт и экспорт параметров в меню Сервис. Дополнительные сведения см. в разделе Параметры Visual Studio. |
Обязательные компоненты
Ниже приведены компоненты, которые необходимы для выполнения данного пошагового руководства.
- Visual Studio 2008.
Создание проекта WPF
Первым этапом является создание проекта WPF для главного приложения.
Создание проекта
Создайте новый проект приложения WPF на языке Visual Basic или Visual C# с именем HostingMonthCalendar. Дополнительные сведения см. в разделе Практическое руководство. Создание нового проекта приложения WPF.
В WPF (конструктор) откроется файл Window1.xaml.
В обозревателе решений добавьте ссылку на сборку WindowsFormsIntegration, которая называется WindowsFormsIntegration.dll.
Создание составного элемента управления Windows Forms
В этой процедуре показано, как создать составной элемент управления, наследуя тип от класса UserControl.
Создание составного элемента управления Windows Forms
Добавьте к решению новый проект библиотеки элементов управления Windows Forms на языке Visual Basic или Visual C# с именем VendorControlLibrary. Дополнительные сведения см. в разделе Практическое руководство. Добавление и удаление элементов решения.
В конструкторе Windows Forms Designer открывается элемент управления UserControl1
В обозревателя решений щелкните правой кнопкой мыши файл UserControl1 и выберите Переименовать.
Измените имя этого элемента управления на VendorControl. При появлении запроса на подтверждение переименования всех ссылок нажмите кнопку Да.
В конструкторе Windows Forms Designer откройте элемент управления «VendorControl».
Выберите элемент управления «VendorControl» на поверхности разработки.
В окне Свойства присвойте свойству Size значение 200,200.
В Панели элементов дважды щелкните элемент управления MonthCalendar.
Элемент управления MonthCalendar отображается на поверхности разработки.
В окне Свойства установите следующие свойства для элемента управления MonthCalendar:
Свойство
Значение
Margin
0,0,0,0
ShowToday
False:
В конструкторе Windows Forms Designer установите размер элемента управления «VendorControl» равным размеру элемента управления MonthCalendar.
Откройте файл VendorControl в редакторе кода.
Замените существующий код следующим кодом. Этот код определяет свойство 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 } }
В меню Построить выберите команду Построить решение для сборки решения.
Размещение элемента управления Windows Forms в WPF
Для размещения элемента управления «VendorControl» в приложении WPF используйте элемент WindowsFormsHost.
Размещение элемента управления Windows Forms в WPF
В проекте HostingMonthCalendar обозревателя решений добавьте ссылку на проект VendorControlLibrary. Дополнительные сведения см. в разделе Практическое руководство. Добавление или удаление ссылок в Visual Studio (Visual Basic).
Откройте файл Window1.xaml в WPF (конструктор).
В представлении 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. Если элемент управления не отображается, откройте вкладку Конструктор, чтобы перейти в представление конструктора.
В меню Отладка выберите команду Начать отладку.
Щелкните элемент управления MonthCalendar для изменения текущей даты. Элемент WPF TextBlock обновляется — отображается выбранная дата.
Следующие действия
Если элемент управления будет широко использоваться в среде WPF, можно создать собственный производный класс от класса WindowsFormsHost и предоставить свойство Date. Это позволит другим элементам управления WPF выполнить привязку непосредственно к свойству Date без использования синтаксиса Path=Child.Date.
Можно также размещать элементы управления WPF в формах Windows Forms. Дополнительные сведения см. в разделе Использование элементов управления Windows Presentation Foundation.