Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu rehber, WPF özelliklerini barındırılan bir Windows Forms denetimi üzerindeki ilgili özelliklerle eşlemek için PropertyMap özelliğini nasıl kullanacağınızı gösterir.
Bu kılavuzda gösterilen görevler şunlardır:
Projeyi oluşturma.
Uygulama düzenini tanımlama.
Yeni özellik eşlemesi tanımlama.
Varsayılan özellik eşlemesi kaldırılıyor.
Varsayılan özellik eşlemesini değiştirme.
Varsayılan özellik eşlemesini genişletme.
İşiniz bittiğinde, WPF özelliklerini barındırılan bir Windows Forms denetimindeki ilgili özelliklerle eşleyebilirsiniz.
Önkoşullar
Bu kılavuzu tamamlamak için aşağıdaki bileşenlere ihtiyacınız vardır:
- Visual Studio 2017
Projeyi oluşturma ve ayarlama
Bir WPF Uygulaması projesi
PropertyMappingWithWfhSampleadıyla oluşturun.Çözüm Gezginiiçinde, WindowsFormsIntegration.dlladlı WindowsFormsIntegration derlemesine bir başvuru ekleyin.
Çözüm Gezgini'nde System.Drawing ve System.Windows.Forms derlemelerine başvurular ekleyin.
Uygulama Düzenini Tanımlama
WPF tabanlı uygulama, bir Windows Forms denetimini barındırmak için WindowsFormsHost öğesini kullanır.
Uygulama düzenini tanımlamak için
WPF Tasarımcısı'nda Window1.xaml dosyasını açın.
Mevcut kodu aşağıdaki kodla değiştirin.
<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>Kod Düzenleyicisi'nde Window1.xaml.cs açın.
Dosyanın en üstünde aşağıdaki ad alanlarını içeri aktarın.
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
Yeni Özellik Eşlemesi Tanımlama
WindowsFormsHost öğesi birkaç varsayılan özellik eşlemesi sağlar. öğesinin AddWindowsFormsHostüzerinde PropertyMap yöntemini çağırarak yeni bir özellik eşlemesi eklersiniz.
Yeni özellik eşlemesi tanımlamak için
Aşağıdaki kodu
Window1sınıfının tanımına kopyalayın.// 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 FunctionAddClipMappingyöntemi, Clip özelliği için yeni bir eşleme ekler.OnClipChangeyöntemi, Clip özelliğini Windows Forms Region özelliğine çevirir.yöntemi pencerenin
Window1_SizeChangedSizeChanged olayını işler ve kırpma bölgesini uygulama penceresine sığacak şekilde boyutlandırabilir.
Varsayılan Özellik Eşlemesini Kaldırma
Remove öğesinin WindowsFormsHost yöntemi üzerinde PropertyMap'yi çağırarak varsayılan özellik eşlemesini kaldırın.
Varsayılan özellik eşlemesini kaldırmak için
Aşağıdaki kodu
Window1sınıfının tanımına kopyalayın.// 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 SubRemoveCursorMappingyöntemi, Cursor özelliği için varsayılan eşlemeyi siler.
Varsayılan Özellik Eşlemesini Değiştirme
Varsayılan bir özellik eşlemesini değiştirmek için, varsayılan eşlemeyi kaldırarak ve Add öğesinin WindowsFormsHost yöntemini çağırarak bunu gerçekleştirin.
Varsayılan özellik eşlemesini değiştirmek için
Aşağıdaki kodu
Window1sınıfının tanımına kopyalayın.// 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 SubReplaceFlowDirectionMappingyöntemi FlowDirection özelliği için varsayılan eşlemeyi değiştirir.OnFlowDirectionChangeyöntemi, FlowDirection özelliğini Windows Forms RightToLeft özelliğine çevirir.cb_CheckedChangedyöntemi, CheckedChanged denetimindeki CheckBox olayını işler. FlowDirection özelliği, CheckState özelliğinin değerine göre atanır
Varsayılan Özellik Eşlemesini Genişletme
Varsayılan özellik eşlemesini kullanabilir ve bunu kendi eşlemenizle genişletebilirsiniz.
Varsayılan özellik eşlemesini genişletmek için
Aşağıdaki kodu
Window1sınıfının tanımına kopyalayın.// 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 SubExtendBackgroundMappingyöntemi, var olan Background özellik eşlemesine özel bir özellik çeviricisi ekler.OnBackgroundChangeyöntemi, barındırılan denetimin BackgroundImage özelliğine belirli bir görüntü atar. varsayılan özellik eşlemesi uygulandıktan sonraOnBackgroundChangeyöntemi çağrılır.
Özellik Eşlemelerinizi Başlatma
Olay işleyicisinde Loaded daha önce açıklanan yöntemleri çağırarak özellik eşlemelerinizi ayarlayın.
Özellik eşlemelerinizi başlatmak için
Aşağıdaki kodu
Window1sınıfının tanımına kopyalayın.// 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 SubWindowLoadedyöntemi Loaded olayını işler ve aşağıdaki başlatmayı gerçekleştirir.Bir Windows FormsCheckBox denetimi oluşturur.
Özellik eşlemelerini ayarlamak için kılavuzda daha önce tanımladığınız yöntemleri çağırır.
Eşlenen özelliklere ilk değerleri atar.
Uygulamayı derlemek ve çalıştırmak için F5 basın. Eşlemenin etkisini görmek için onay kutusuna FlowDirection tıklayın. Onay kutusuna tıkladığınızda, düzen sağ sol yönünü tersine çevirir.
Ayrıca bakınız
.NET Desktop feedback