Wskazówki: mapowanie właściwości z użyciem elementu WindowsFormsHost
W tym przewodniku pokazano, jak za pomocą PropertyMap właściwości mapować właściwości WPF na odpowiednie właściwości w hostowanej kontrolce Windows Forms.
Zadania przedstawione w tym przewodniku obejmują:
Tworzenie projektu.
Definiowanie układu aplikacji.
Definiowanie nowego mapowania właściwości.
Usuwanie domyślnego mapowania właściwości.
Zastępowanie domyślnego mapowania właściwości.
Rozszerzanie domyślnego mapowania właściwości.
Po zakończeniu będzie można mapować właściwości WPF na odpowiednie właściwości w hostowanej kontrolce Windows Forms.
Wymagania wstępne
Następujące składniki są wymagane do przeprowadzenia tego instruktażu:
- Visual Studio 2017
Tworzenie i konfigurowanie projektu
Utwórz projekt aplikacji WPF o nazwie
PropertyMappingWithWfhSample
.W Eksplorator rozwiązań dodaj odwołanie do zestawu WindowsFormsIntegration o nazwie WindowsFormsIntegration.
W Eksplorator rozwiązań dodaj odwołania do zestawów System.Drawing i System.Windows.Forms.
Definiowanie układu aplikacji
Aplikacja oparta na WPF używa WindowsFormsHost elementu do hostowania kontrolki Windows Forms.
Aby zdefiniować układ aplikacji
Otwórz plik Window1.xaml w Projektant WPF.
Zastąp istniejący kod następującym kodem.
<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>
Otwórz plik Window1.xaml.cs w Edytorze kodu.
W górnej części pliku zaimportuj następujące przestrzenie nazw.
using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; using System.Windows.Forms.Integration;
Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms Imports System.Windows.Forms.Integration
Definiowanie nowego mapowania właściwości
Element WindowsFormsHost zawiera kilka domyślnych mapowań właściwości. Dodasz nowe mapowanie właściwości, wywołując metodę Add w elemecie PropertyMapWindowsFormsHost .
Aby zdefiniować nowe mapowanie właściwości
Skopiuj następujący kod do definicji
Window1
klasy .// 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) ); }
' The AddClipMapping method adds a custom mapping ' for the Clip property. Private Sub AddClipMapping() wfHost.PropertyMap.Add( _ "Clip", _ New PropertyTranslator(AddressOf OnClipChange)) End Sub ' The OnClipChange method assigns an elliptical clipping ' region to the hosted control's Region property. Private Sub OnClipChange( _ ByVal h As Object, _ ByVal propertyName As String, _ ByVal value As Object) Dim host As WindowsFormsHost = h Dim cb As System.Windows.Forms.CheckBox = host.Child If cb IsNot Nothing Then cb.Region = Me.CreateClipRegion() End If End Sub ' 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 Sub Window1_SizeChanged( _ ByVal sender As Object, _ ByVal e As SizeChangedEventArgs) Me.OnClipChange(wfHost, "Clip", Nothing) End Sub ' The CreateClipRegion method creates a Region from an ' elliptical GraphicsPath. Private Function CreateClipRegion() As [Region] Dim path As New GraphicsPath() path.StartFigure() path.AddEllipse(New System.Drawing.Rectangle( _ 0, _ 0, _ wfHost.ActualWidth, _ wfHost.ActualHeight)) path.CloseFigure() Return New [Region](path) End Function
Metoda
AddClipMapping
dodaje nowe mapowanie dla Clip właściwości .Metoda
OnClipChange
tłumaczy Clip właściwość na właściwość Windows FormsRegion .Metoda
Window1_SizeChanged
obsługuje zdarzenie okna SizeChanged i rozmiary regionu wycinków, aby dopasować je do okna aplikacji.
Usuwanie domyślnego mapowania właściwości
Usuń domyślne mapowanie właściwości, wywołując metodę Remove w elemecie PropertyMapWindowsFormsHost .
Aby usunąć domyślne mapowanie właściwości
Skopiuj następujący kod do definicji
Window1
klasy .// The RemoveCursorMapping method deletes the default // mapping for the Cursor property. private void RemoveCursorMapping() { wfHost.PropertyMap.Remove("Cursor"); }
' The RemoveCursorMapping method deletes the default ' mapping for the Cursor property. Private Sub RemoveCursorMapping() wfHost.PropertyMap.Remove("Cursor") End Sub
Metoda
RemoveCursorMapping
usuwa domyślne mapowanie właściwości Cursor .
Zastępowanie domyślnego mapowania właściwości
Zastąp domyślne mapowanie właściwości, usuwając domyślne mapowanie i wywołując metodę Add w elemencie WindowsFormsHostPropertyMap.
Aby zastąpić domyślne mapowanie właściwości
Skopiuj następujący kod do definicji
Window1
klasy .// 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; }
' The ReplaceFlowDirectionMapping method replaces the ' default mapping for the FlowDirection property. Private Sub ReplaceFlowDirectionMapping() wfHost.PropertyMap.Remove("FlowDirection") wfHost.PropertyMap.Add( _ "FlowDirection", _ New PropertyTranslator(AddressOf OnFlowDirectionChange)) End Sub ' 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 Sub OnFlowDirectionChange( _ ByVal h As Object, _ ByVal propertyName As String, _ ByVal value As Object) Dim host As WindowsFormsHost = h Dim fd As System.Windows.FlowDirection = _ CType(value, System.Windows.FlowDirection) Dim cb As System.Windows.Forms.CheckBox = host.Child cb.RightToLeft = IIf(fd = System.Windows.FlowDirection.RightToLeft, _ RightToLeft.Yes, _ RightToLeft.No) End Sub ' 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 Sub cb_CheckedChanged( _ ByVal sender As Object, _ ByVal e As EventArgs) Dim cb As System.Windows.Forms.CheckBox = sender wfHost.FlowDirection = IIf(cb.CheckState = CheckState.Checked, _ System.Windows.FlowDirection.RightToLeft, _ System.Windows.FlowDirection.LeftToRight) End Sub
Metoda
ReplaceFlowDirectionMapping
zastępuje domyślne mapowanie właściwości FlowDirection .Metoda
OnFlowDirectionChange
tłumaczy FlowDirection właściwość na właściwość Windows FormsRightToLeft .Metoda
cb_CheckedChanged
obsługuje CheckedChanged zdarzenie w kontrolce CheckBox . Przypisuje FlowDirection właściwość na podstawie wartości CheckState właściwości
Rozszerzanie domyślnego mapowania właściwości
Możesz użyć domyślnego mapowania właściwości, a także rozszerzyć go przy użyciu własnego mapowania.
Aby rozszerzyć domyślne mapowanie właściwości
Skopiuj następujący kod do definicji
Window1
klasy .// 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"); } }
' The ExtendBackgroundMapping method adds a property ' translator if a mapping already exists. Private Sub ExtendBackgroundMapping() If wfHost.PropertyMap("Background") IsNot Nothing Then wfHost.PropertyMap("Background") = PropertyTranslator.Combine( _ wfHost.PropertyMap("Background"), _ PropertyTranslator.CreateDelegate( _ GetType(PropertyTranslator), _ Me, _ "OnBackgroundChange")) End If End Sub ' The OnBackgroundChange method assigns a specific image ' to the hosted control's BackgroundImage property. Private Sub OnBackgroundChange(ByVal h As Object, ByVal propertyName As String, ByVal value As Object) Dim host As WindowsFormsHost = h Dim cb As System.Windows.Forms.CheckBox = host.Child Dim b As ImageBrush = value If Not (b Is Nothing) Then cb.BackgroundImage = New System.Drawing.Bitmap("C:\WINDOWS\Santa Fe Stucco.bmp") End If End Sub
Metoda
ExtendBackgroundMapping
dodaje translator właściwości niestandardowych do istniejącego Background mapowania właściwości.Metoda
OnBackgroundChange
przypisuje określony obraz do właściwości hostowanej kontrolki BackgroundImage . Metoda jest wywoływanaOnBackgroundChange
po zastosowaniu domyślnego mapowania właściwości.
Inicjowanie mapowań właściwości
Skonfiguruj mapowania właściwości, wywołując wcześniej opisane metody w procedurze obsługi zdarzeń Loaded .
Aby zainicjować mapowania właściwości
Skopiuj następujący kod do definicji
Window1
klasy .// 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(); }
' 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 Sub WindowLoaded( _ ByVal sender As Object, _ ByVal e As RoutedEventArgs) System.Windows.Forms.Application.EnableVisualStyles() ' Create a Windows Forms checkbox control and assign ' it as the WindowsFormsHost element's child. Dim cb As New System.Windows.Forms.CheckBox() cb.Text = "Windows Forms checkbox" cb.Dock = DockStyle.Fill cb.TextAlign = ContentAlignment.MiddleCenter AddHandler cb.CheckedChanged, AddressOf cb_CheckedChanged wfHost.Child = cb ' Replace the default mapping for the FlowDirection property. Me.ReplaceFlowDirectionMapping() ' Remove the mapping for the Cursor property. Me.RemoveCursorMapping() ' Add the mapping for the Clip property. Me.AddClipMapping() ' Add another mapping for the Background property. Me.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() End Sub
Metoda
WindowLoaded
obsługuje Loaded zdarzenie i wykonuje następującą inicjację.Tworzy kontrolkę Formularze systemuCheckBox Windows.
Wywołuje metody zdefiniowane wcześniej w przewodniku, aby skonfigurować mapowania właściwości.
Przypisuje wartości początkowe do zamapowanych właściwości.
Naciśnij klawisz F5, aby skompilować i uruchomić aplikację. Kliknij pole wyboru, aby zobaczyć efekt FlowDirection mapowania. Po kliknięciu pola wyboru układ odwraca orientację po lewej stronie.
Zobacz też
.NET Desktop feedback