Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Panduan ini menunjukkan kepada Anda cara menggunakan PropertyMap properti untuk memetakan properti WPF ke properti yang sesuai pada kontrol Formulir Windows yang dihosting.
Tugas yang diilustrasikan dalam panduan ini meliputi:
Membuat proyek.
Menentukan tata letak aplikasi.
Menentukan pemetaan properti baru.
Menghapus pemetaan properti default.
Mengubah pemetaan properti bawaan.
Memperpanjang pemetaan properti bawaan.
Setelah selesai, Anda akan dapat memetakan properti WPF ke properti yang sesuai pada kontrol Formulir Windows yang dihosting.
Prasyarat
Anda memerlukan komponen berikut untuk menyelesaikan panduan ini:
- Visual Studio 2017
Membuat dan menyiapkan proyek
Buat proyek Aplikasi WPF
bernama . Di Solution Explorer, tambahkan referensi ke rakitan WindowsFormsIntegration, yang diberi nama WindowsFormsIntegration.dll.
Di Penjelajah Solusi, tambahkan referensi ke rakitan System.Drawing dan System.Windows.Forms.
Menentukan Tata Letak Aplikasi
Aplikasi berbasis WPF menggunakan WindowsFormsHost elemen untuk menghosting kontrol Formulir Windows.
Untuk menentukan tata letak aplikasi
Buka Window1.xaml di WPF Designer.
Ganti kode yang ada dengan kode berikut.
<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>Buka Window1.xaml.cs di Editor Kode.
Di bagian atas file, impor namespace berikut.
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
Menentukan Pemetaan Properti Baru
Elemen ini WindowsFormsHost menyediakan beberapa pemetaan properti default. Anda menambahkan pemetaan properti baru dengan memanggil Add metode pada WindowsFormsHost elemen PropertyMap.
Untuk menentukan pemetaan properti baru
Salin kode berikut ke dalam definisi untuk kelas
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) ); }' 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 FunctionMetode
AddClipMappingmenambahkan pemetaan baru untuk properti Clip.Metode
OnClipChangemenerjemahkan properti Clip menjadi properti Windows FormsRegion.Metode
Window1_SizeChangedmenangani kejadian jendela SizeChanged dan mengatur ukuran wilayah kliping agar sesuai dengan jendela aplikasi.
Menghapus Pemetaan Properti Default
Hapus pemetaan properti default dengan memanggil Remove metode pada WindowsFormsHost elemen PropertyMap.
Untuk menghapus pemetaan properti default
Salin kode berikut ke dalam definisi untuk kelas
Window1.// 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 SubMetode
RemoveCursorMappingmenghapus pemetaan default untuk properti Cursor.
Mengganti Pemetaan Properti Bawaan
Ganti pemetaan properti default dengan menghapus pemetaan default dan memanggil metode Add pada elemen WindowsFormsHostPropertyMap.
Untuk mengganti pemetaan properti default
Salin kode berikut ke dalam definisi untuk kelas
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; }' 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 SubMetode
ReplaceFlowDirectionMappingmenggantikan pemetaan default untuk properti FlowDirection.Metode
OnFlowDirectionChangemenerjemahkan properti FlowDirection menjadi properti Windows FormsRightToLeft.Metode
cb_CheckedChangedmenangani peristiwa CheckedChanged pada kontrol CheckBox. Ini menetapkan FlowDirection properti berdasarkan nilai CheckState properti
Memperluas Pemetaan Properti Default
Anda dapat menggunakan pemetaan properti default dan juga memperluasnya dengan pemetaan Anda sendiri.
Untuk memperluas pemetaan properti bawaan
Salin kode berikut ke dalam definisi untuk kelas
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"); } }' 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 SubMetode
ExtendBackgroundMappingmenambahkan penerjemah properti kustom ke pemetaan properti Background yang ada.Metode
OnBackgroundChangemenetapkan gambar tertentu ke properti BackgroundImage kontrol yang dihosting. MetodeOnBackgroundChangedipanggil setelah pemetaan properti default diterapkan.
Menginisialisasi Pemetaan Properti Anda
Siapkan pemetaan properti Anda dengan memanggil metode yang dijelaskan sebelumnya di penangan kejadian Loaded.
Untuk menginisialisasi pemetaan properti Anda
Salin kode berikut ke dalam definisi untuk kelas
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(); }' 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 SubMetode
WindowLoadedmenangani peristiwa Loaded dan melakukan inisialisasi berikut.Membuat kontrol Windows FormsCheckBox.
Memanggil metode yang sudah Anda tentukan sebelumnya dalam panduan ini untuk menyiapkan pemetaan properti.
Menetapkan nilai awal ke properti yang dipetakan.
Tekan
F5 untuk membangun dan menjalankan aplikasi. Klik kotak centang untuk melihat efek pemetaan FlowDirection. Saat Anda mengklik kotak centang, tata letak membalikkan orientasi kanan kirinya.
Lihat juga
- WindowsFormsHost.PropertyMap
- ElementHost.PropertyMap
- WindowsFormsHost
- Pemetaan Properti Formulir Windows dan WPF
- Mendesain XAML di Visual Studio
- Pengantar Langkah-langkah : Menghosting Kontrol Formulir Windows di WPF
.NET Desktop feedback