Пошаговое руководство. Сопоставление свойств с помощью элемента WindowsFormsHost
В этом пошаговом руководстве показано, как использовать PropertyMap свойства для сопоставления WPF свойств с соответствующими свойствами вложенного Windows Forms элемента управления.
В данном пошаговом руководстве представлены следующие задачи.
Создание проекта.
Определение макета приложения.
Определение нового сопоставления свойства.
Удаление сопоставления свойства по умолчанию.
Замена сопоставления свойства по умолчанию.
Расширение сопоставления свойства по умолчанию.
Полный пример кода для задач, приведенных в этом пошаговом руководстве, см. в разделе сопоставления свойств с помощью образец элемента WindowsFormsHost.
Когда вы закончите, можно сопоставить WPF свойств с соответствующими свойствами вложенного Windows Forms элемента управления.
Предварительные требования
Ниже приведены компоненты, необходимые для выполнения данного пошагового руководства.
- Visual Studio 2017
Создание и настройка проекта
Создание приложение WPF проект с именем
PropertyMappingWithWfhSample
.В обозревателе решений, добавьте ссылку на сборку WindowsFormsIntegration с именем WindowsFormsIntegration.dll.
В обозревателе решений, добавьте ссылки на сборки System.Drawing и System.Windows.Forms.
Определение макета приложения
WPF-Основе приложением WindowsFormsHost для размещения элемента Windows Forms элемента управления.
Определение макета приложения
Откройте файл Window1.xaml в Конструктор WPF.
Замените существующий код следующим кодом:
<Window x:Class="PropertyMappingWithWfh.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="PropertyMappingWithWfh" Height="300" Width="300" Loaded="WindowLoaded"> <DockPanel Name="panel1" LastChildFill="True"> <WindowsFormsHost Name="wfHost" DockPanel.Dock="Left" SizeChanged="Window1_SizeChanged" FontSize="20" /> </DockPanel> </Window>
Откройте файл Window1.xaml.cs в редакторе кода.
В верхней части файла импортируйте указанные ниже пространства имен.
using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; using System.Windows.Forms.Integration;
Определение нового сопоставления свойства
WindowsFormsHost Элемент предоставляет несколько стандартных сопоставления свойств. Добавить новое сопоставление свойства путем вызова Add метод WindowsFormsHost элемента PropertyMap.
Определение нового сопоставления свойства
Скопируйте следующий код в определение
Window1
класса.// The AddClipMapping method adds a custom // mapping for the Clip property. private void AddClipMapping() { wfHost.PropertyMap.Add( "Clip", new PropertyTranslator(OnClipChange)); } // The OnClipChange method assigns an elliptical clipping // region to the hosted control's Region property. private void OnClipChange(object h, String propertyName, object value) { WindowsFormsHost host = h as WindowsFormsHost; System.Windows.Forms.CheckBox cb = host.Child as System.Windows.Forms.CheckBox; if (cb != null) { cb.Region = this.CreateClipRegion(); } } // The Window1_SizeChanged method handles the window's // SizeChanged event. It calls the OnClipChange method explicitly // to assign a new clipping region to the hosted control. private void Window1_SizeChanged(object sender, SizeChangedEventArgs e) { this.OnClipChange(wfHost, "Clip", null); } // The CreateClipRegion method creates a Region from an // elliptical GraphicsPath. private Region CreateClipRegion() { GraphicsPath path = new GraphicsPath(); path.StartFigure(); path.AddEllipse(new System.Drawing.Rectangle( 0, 0, (int)wfHost.ActualWidth, (int)wfHost.ActualHeight ) ); path.CloseFigure(); return( new Region(path) ); }
AddClipMapping
Метод добавляет новое сопоставление для Clip свойство.OnClipChange
Метод преобразует Clip свойства Windows FormsRegion свойство.Window1_SizeChanged
Метод обрабатывает окна SizeChanged событий и изменяет размер отсеченной области по размеру окна приложения.
Удаление сопоставления свойства по умолчанию
Удаление сопоставления свойства по умолчанию путем вызова Remove метод WindowsFormsHost элемента PropertyMap.
Удаление сопоставления свойства по умолчанию
Скопируйте следующий код в определение
Window1
класса.// The RemoveCursorMapping method deletes the default // mapping for the Cursor property. private void RemoveCursorMapping() { wfHost.PropertyMap.Remove("Cursor"); }
RemoveCursorMapping
Метод удаляет сопоставление по умолчанию для Cursor свойство.
Замена сопоставления свойства по умолчанию
Замена сопоставления свойства по умолчанию, удалив сопоставление по умолчанию и вызывая метод Add метод WindowsFormsHost элемента PropertyMap.
Замена сопоставления свойства по умолчанию
Скопируйте следующий код в определение
Window1
класса.// The ReplaceFlowDirectionMapping method replaces the // default mapping for the FlowDirection property. private void ReplaceFlowDirectionMapping() { wfHost.PropertyMap.Remove("FlowDirection"); wfHost.PropertyMap.Add( "FlowDirection", new PropertyTranslator(OnFlowDirectionChange)); } // The OnFlowDirectionChange method translates a // Windows Presentation Foundation FlowDirection value // to a Windows Forms RightToLeft value and assigns // the result to the hosted control's RightToLeft property. private void OnFlowDirectionChange(object h, String propertyName, object value) { WindowsFormsHost host = h as WindowsFormsHost; System.Windows.FlowDirection fd = (System.Windows.FlowDirection)value; System.Windows.Forms.CheckBox cb = host.Child as System.Windows.Forms.CheckBox; cb.RightToLeft = (fd == System.Windows.FlowDirection.RightToLeft ) ? RightToLeft.Yes : RightToLeft.No; } // The cb_CheckedChanged method handles the hosted control's // CheckedChanged event. If the Checked property is true, // the flow direction is set to RightToLeft, otherwise it is // set to LeftToRight. private void cb_CheckedChanged(object sender, EventArgs e) { System.Windows.Forms.CheckBox cb = sender as System.Windows.Forms.CheckBox; wfHost.FlowDirection = ( cb.CheckState == CheckState.Checked ) ? System.Windows.FlowDirection.RightToLeft : System.Windows.FlowDirection.LeftToRight; }
ReplaceFlowDirectionMapping
Метод заменяет сопоставление по умолчанию для FlowDirection свойство.OnFlowDirectionChange
Метод преобразует FlowDirection свойства Windows FormsRightToLeft свойство.cb_CheckedChanged
Метод обрабатывает CheckedChanged событий на CheckBox элемента управления. Он назначает FlowDirection значение в зависимости от значения CheckState свойство
Расширение сопоставления свойства по умолчанию
Вы можете использовать сопоставление свойства по умолчанию, а также расширить его с помощью собственного сопоставления.
Расширение сопоставления свойства по умолчанию
Скопируйте следующий код в определение
Window1
класса.// The ExtendBackgroundMapping method adds a property // translator if a mapping already exists. private void ExtendBackgroundMapping() { if (wfHost.PropertyMap["Background"] != null) { wfHost.PropertyMap["Background"] += new PropertyTranslator(OnBackgroundChange); } } // The OnBackgroundChange method assigns a specific image // to the hosted control's BackgroundImage property. private void OnBackgroundChange(object h, String propertyName, object value) { WindowsFormsHost host = h as WindowsFormsHost; System.Windows.Forms.CheckBox cb = host.Child as System.Windows.Forms.CheckBox; ImageBrush b = value as ImageBrush; if (b != null) { cb.BackgroundImage = new System.Drawing.Bitmap(@"C:\WINDOWS\Santa Fe Stucco.bmp"); } }
ExtendBackgroundMapping
Метод добавляет пользовательский преобразователь свойств для существующего Background сопоставление свойств.OnBackgroundChange
Метод присваивает определенное изображение для размещенного элемента управления BackgroundImage свойство.OnBackgroundChange
Метод вызывается после применения сопоставления свойства по умолчанию.
Инициализация сопоставлений свойств
Настройка сопоставлений свойств путем вызова ранее описанных методов в Loaded обработчик событий.
Инициализация сопоставлений свойств
Скопируйте следующий код в определение
Window1
класса.// The WindowLoaded method handles the Loaded event. // It enables Windows Forms visual styles, creates // a Windows Forms checkbox control, and assigns the // control as the child of the WindowsFormsHost element. // This method also modifies property mappings on the // WindowsFormsHost element. private void WindowLoaded(object sender, RoutedEventArgs e) { System.Windows.Forms.Application.EnableVisualStyles(); // Create a Windows Forms checkbox control and assign // it as the WindowsFormsHost element's child. System.Windows.Forms.CheckBox cb = new System.Windows.Forms.CheckBox(); cb.Text = "Windows Forms checkbox"; cb.Dock = DockStyle.Fill; cb.TextAlign = ContentAlignment.MiddleCenter; cb.CheckedChanged += new EventHandler(cb_CheckedChanged); wfHost.Child = cb; // Replace the default mapping for the FlowDirection property. this.ReplaceFlowDirectionMapping(); // Remove the mapping for the Cursor property. this.RemoveCursorMapping(); // Add the mapping for the Clip property. this.AddClipMapping(); // Add another mapping for the Background property. this.ExtendBackgroundMapping(); // Cause the OnFlowDirectionChange delegate to be called. wfHost.FlowDirection = System.Windows.FlowDirection.LeftToRight; // Cause the OnClipChange delegate to be called. wfHost.Clip = new RectangleGeometry(); // Cause the OnBackgroundChange delegate to be called. wfHost.Background = new ImageBrush(); }
WindowLoaded
Метод обрабатывает Loaded событий и выполнения следующей инициализации.Создает Windows FormsCheckBox элемента управления.
Вызывает методы, ранее определенные в руководстве, для настройки сопоставлений свойств.
Присваивает начальные значения сопоставленным свойствам.
Нажмите клавишу F5, чтобы выполнить сборку приложения и запустить его. Щелкните флажок, чтобы увидеть эффект FlowDirection сопоставления. При установке флажка меняется ориентация макета по горизонтали.