Wskazówki: mapowanie właściwości z użyciem formantu ElementHost
W tym przewodniku pokazano, jak za pomocą PropertyMap właściwości mapować właściwości formularzy systemu Windows na odpowiednie właściwości w hostowanym elememencie WPF.
Zadania przedstawione w tym przewodniku obejmują:
Tworzenie projektu.
Definiowanie nowego mapowania właściwości.
Usuwanie 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 formularzy systemu Windows na odpowiednie właściwości WPF w elememencie hostowanym.
Wymagania wstępne
Następujące składniki są wymagane do przeprowadzenia tego instruktażu:
- Visual Studio 2017
Tworzenie projektu
Aby utworzyć projekt
Utwórz projekt aplikacji Windows Forms o nazwie
PropertyMappingWithElementHost
.W Eksplorator rozwiązań dodaj odwołania do następujących zestawów WPF.
Rdzeń prezentacji
Element PresentationFramework
Windowsbase
WindowsFormsIntegration
Skopiuj poniższy kod w górnej
Form1
części pliku kodu.using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Forms.Integration;
Imports System.Windows Imports System.Windows.Media Imports System.Windows.Media.Imaging Imports System.Windows.Forms.Integration
Otwórz
Form1
plik w Projektant Windows Forms. Kliknij dwukrotnie formularz, aby dodać procedurę obsługi zdarzeń dla Load zdarzenia.Wróć do Projektant formularzy systemu Windows i dodaj procedurę obsługi zdarzeń dla zdarzenia formularzaResize. Aby uzyskać więcej informacji, zobacz How to: Create Event Handlers Using the Projektant (Instrukcje: tworzenie procedur obsługi zdarzeń przy użyciu Projektant).
Zadeklaruj ElementHost
Form1
pole w klasie .ElementHost elemHost = null;
Private elemHost As ElementHost = Nothing
Definiowanie nowych mapowań właściwości
Kontrolka ElementHost udostępnia kilka domyślnych mapowań właściwości. Dodasz nowe mapowanie właściwości, wywołując metodę Add w kontrolce ElementHostPropertyMap.
Aby zdefiniować nowe mapowania właściwości
Skopiuj następujący kod do definicji
Form1
klasy .// The AddMarginMapping method adds a new property mapping // for the Margin property. private void AddMarginMapping() { elemHost.PropertyMap.Add( "Margin", new PropertyTranslator(OnMarginChange)); } // The OnMarginChange method implements the mapping // from the Windows Forms Margin property to the // Windows Presentation Foundation Margin property. // // The provided Padding value is used to construct // a Thickness value for the hosted element's Margin // property. private void OnMarginChange(object h, String propertyName, object value) { ElementHost host = h as ElementHost; Padding p = (Padding)value; System.Windows.Controls.Button wpfButton = host.Child as System.Windows.Controls.Button; Thickness t = new Thickness(p.Left, p.Top, p.Right, p.Bottom ); wpfButton.Margin = t; }
' The AddMarginMapping method adds a new property mapping ' for the Margin property. Private Sub AddMarginMapping() elemHost.PropertyMap.Add( _ "Margin", _ New PropertyTranslator(AddressOf OnMarginChange)) End Sub ' The OnMarginChange method implements the mapping ' from the Windows Forms Margin property to the ' Windows Presentation Foundation Margin property. ' ' The provided Padding value is used to construct ' a Thickness value for the hosted element's Margin ' property. Private Sub OnMarginChange( _ ByVal h As Object, _ ByVal propertyName As String, _ ByVal value As Object) Dim host As ElementHost = h Dim p As Padding = CType(value, Padding) Dim wpfButton As System.Windows.Controls.Button = host.Child Dim t As New Thickness(p.Left, p.Top, p.Right, p.Bottom) wpfButton.Margin = t End Sub
Metoda
AddMarginMapping
dodaje nowe mapowanie dla Margin właściwości .Metoda
OnMarginChange
tłumaczy Margin właściwość na właściwość WPF Margin .Skopiuj następujący kod do definicji
Form1
klasy .// The AddRegionMapping method assigns a custom // mapping for the Region property. private void AddRegionMapping() { elemHost.PropertyMap.Add( "Region", new PropertyTranslator(OnRegionChange)); } // The OnRegionChange method assigns an EllipseGeometry to // the hosted element's Clip property. private void OnRegionChange( object h, String propertyName, object value) { ElementHost host = h as ElementHost; System.Windows.Controls.Button wpfButton = host.Child as System.Windows.Controls.Button; wpfButton.Clip = new EllipseGeometry(new Rect( 0, 0, wpfButton.ActualWidth, wpfButton.ActualHeight)); } // The Form1_Resize method handles the form's Resize event. // It calls the OnRegionChange method explicitly to // assign a new clipping geometry to the hosted element. private void Form1_Resize(object sender, EventArgs e) { this.OnRegionChange(elemHost, "Region", null); }
' The AddRegionMapping method assigns a custom ' mapping for the Region property. Private Sub AddRegionMapping() elemHost.PropertyMap.Add( _ "Region", _ New PropertyTranslator(AddressOf OnRegionChange)) End Sub ' The OnRegionChange method assigns an EllipseGeometry to ' the hosted element's Clip property. Private Sub OnRegionChange( _ ByVal h As Object, _ ByVal propertyName As String, _ ByVal value As Object) Dim host As ElementHost = h Dim wpfButton As System.Windows.Controls.Button = host.Child wpfButton.Clip = New EllipseGeometry(New Rect( _ 0, _ 0, _ wpfButton.ActualWidth, _ wpfButton.ActualHeight)) End Sub ' The Form1_Resize method handles the form's Resize event. ' It calls the OnRegionChange method explicitly to ' assign a new clipping geometry to the hosted element. Private Sub Form1_Resize( _ ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Resize If elemHost IsNot Nothing Then Me.OnRegionChange(elemHost, "Region", Nothing) End If End Sub
Metoda
AddRegionMapping
dodaje nowe mapowanie dla Region właściwości .Metoda
OnRegionChange
tłumaczy Region właściwość na właściwość WPF Clip .Metoda
Form1_Resize
obsługuje zdarzenie formularza Resize i rozmiaruje region wycinków w celu dopasowania go do hostowanego elementu.
Usuwanie domyślnego mapowania właściwości
Usuń domyślne mapowanie właściwości, wywołując metodę Remove w kontrolce ElementHostPropertyMap.
Aby usunąć domyślne mapowanie właściwości
Skopiuj następujący kod do definicji
Form1
klasy .// The RemoveCursorMapping method deletes the default // mapping for the Cursor property. private void RemoveCursorMapping() { elemHost.PropertyMap.Remove("Cursor"); }
' The RemoveCursorMapping method deletes the default ' mapping for the Cursor property. Private Sub RemoveCursorMapping() elemHost.PropertyMap.Remove("Cursor") End Sub
Metoda
RemoveCursorMapping
usuwa domyślne mapowanie właściwości Cursor .
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
Form1
klasy .// The ExtendBackColorMapping method adds a property // translator if a mapping already exists. private void ExtendBackColorMapping() { if (elemHost.PropertyMap["BackColor"] != null) { elemHost.PropertyMap["BackColor"] += new PropertyTranslator(OnBackColorChange); } } // The OnBackColorChange method assigns a specific image // to the hosted element's Background property. private void OnBackColorChange(object h, String propertyName, object value) { ElementHost host = h as ElementHost; System.Windows.Controls.Button wpfButton = host.Child as System.Windows.Controls.Button; ImageBrush b = new ImageBrush(new BitmapImage( new Uri(@"file:///C:\WINDOWS\Santa Fe Stucco.bmp"))); wpfButton.Background = b; }
' The ExtendBackColorMapping method adds a property ' translator if a mapping already exists. Private Sub ExtendBackColorMapping() If elemHost.PropertyMap("BackColor") IsNot Nothing Then elemHost.PropertyMap("BackColor") = PropertyTranslator.Combine( _ elemHost.PropertyMap("BackColor"), _ PropertyTranslator.CreateDelegate( _ GetType(PropertyTranslator), _ Me, _ "OnBackColorChange")) End If End Sub ' The OnBackColorChange method assigns a specific image ' to the hosted element's Background property. Private Sub OnBackColorChange( _ ByVal h As Object, _ ByVal propertyName As String, _ ByVal value As Object) Dim host As ElementHost = h Dim wpfButton As System.Windows.Controls.Button = host.Child Dim b As New ImageBrush(New BitmapImage( _ New Uri("file:///C:\WINDOWS\Santa Fe Stucco.bmp"))) wpfButton.Background = b End Sub
Metoda
ExtendBackColorMapping
dodaje translator właściwości niestandardowych do istniejącego BackColor mapowania właściwości.Metoda
OnBackColorChange
przypisuje określony obraz do właściwości hostowanej kontrolki Background . Metoda jest wywoływanaOnBackColorChange
po zastosowaniu domyślnego mapowania właściwości.
Inicjowanie mapowań właściwości
Skopiuj następujący kod do definicji
Form1
klasy .private void Form1_Load(object sender, EventArgs e) { // Create the ElementHost control. elemHost = new ElementHost(); elemHost.Dock = DockStyle.Fill; this.Controls.Add(elemHost); // Create a Windows Presentation Foundation Button element // and assign it as the ElementHost control's child. System.Windows.Controls.Button wpfButton = new System.Windows.Controls.Button(); wpfButton.Content = "Windows Presentation Foundation Button"; elemHost.Child = wpfButton; // Map the Margin property. this.AddMarginMapping(); // Remove the mapping for the Cursor property. this.RemoveCursorMapping(); // Add a mapping for the Region property. this.AddRegionMapping(); // Add another mapping for the BackColor property. this.ExtendBackColorMapping(); // Cause the OnMarginChange delegate to be called. elemHost.Margin = new Padding(23, 23, 23, 23); // Cause the OnRegionChange delegate to be called. elemHost.Region = new Region(); // Cause the OnBackColorChange delegate to be called. elemHost.BackColor = System.Drawing.Color.AliceBlue; }
Private Sub Form1_Load( _ ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Load ' Create the ElementHost control. elemHost = New ElementHost() elemHost.Dock = DockStyle.Fill Me.Controls.Add(elemHost) ' Create a Windows Presentation Foundation Button element ' and assign it as the ElementHost control's child. Dim wpfButton As New System.Windows.Controls.Button() wpfButton.Content = "Windows Presentation Foundation Button" elemHost.Child = wpfButton ' Map the Margin property. Me.AddMarginMapping() ' Remove the mapping for the Cursor property. Me.RemoveCursorMapping() ' Add a mapping for the Region property. Me.AddRegionMapping() ' Add another mapping for the BackColor property. Me.ExtendBackColorMapping() ' Cause the OnMarginChange delegate to be called. elemHost.Margin = New Padding(23, 23, 23, 23) ' Cause the OnRegionChange delegate to be called. elemHost.Region = New [Region]() ' Cause the OnBackColorChange delegate to be called. elemHost.BackColor = System.Drawing.Color.AliceBlue End Sub
Metoda
Form1_Load
obsługuje Load zdarzenie i wykonuje następującą inicjację.Tworzy element WPF Button .
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ę.
Zobacz też
.NET Desktop feedback