İzlenecek yol: ElementHost Denetimini Kullanarak Özellikleri Eşleme
bu izlenecek yol, PropertyMap özelliği barındırılan WPF öğesindeki ilgili özelliklerle Windows Forms özelliklerini eşlemek için nasıl kullanacağınızı gösterir.
Bu izlenecek yolda gösterilen görevler şunlardır:
Proje oluşturuluyor.
Yeni özellik eşlemesi tanımlama.
Varsayılan özellik eşlemesi kaldırılıyor.
Varsayılan özellik eşlemesini genişletme.
işiniz bittiğinde, Windows Forms özelliklerini barındırılan bir öğe üzerinde ilgili WPF özellikleriyle eşleyebilirsiniz.
Önkoşullar
Bu izlenecek yolu tamamlamak için aşağıdaki bileşenlere ihtiyacınız vardır:
- Visual Studio 2017
Projeyi Oluşturma
Proje oluşturmak için
adlı Windows Forms bir uygulama projesi oluşturun .
Çözüm Gezgini, aşağıdaki WPF derlemelerine başvuruları ekleyin.
PresentationCore
PresentationFramework
WindowsBase
WindowsFormsIntegration
Aşağıdaki kodu, kod dosyasının en üstüne kopyalayın
Form1.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.IntegrationForm1Windows Form Tasarımcısı açın. Olaya bir olay işleyicisi eklemek için forma çift tıklayın Load .Windows Form Tasarımcısı dönün ve formun olayı için bir olay işleyicisi ekleyin Resize . Daha fazla bilgi için bkz. nasıl yapılır: tasarımcı kullanarak olay Işleyicileri oluşturma.
Sınıfında bir ElementHost alan bildirin
Form1.ElementHost elemHost = null;Private elemHost As ElementHost = Nothing
Yeni özellik eşlemelerini tanımlama
ElementHostDenetim, çeşitli varsayılan özellik eşlemeleri sağlar. AddDenetimin ' de yöntemini çağırarak yeni bir özellik eşlemesi eklersiniz ElementHostPropertyMap .
Yeni özellik eşlemelerini tanımlamak için
Aşağıdaki kodu sınıfının tanımına kopyalayın
Form1.// 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 SubAddMarginMappingYöntemi, özelliği için yeni bir eşleme ekler Margin .OnMarginChangeYöntemi, Margin özelliği WPF Margin özelliğine çevirir.Aşağıdaki kodu sınıfının tanımına kopyalayın
Form1.// 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 SubAddRegionMappingYöntemi, özelliği için yeni bir eşleme ekler Region .OnRegionChangeYöntemi, Region özelliği WPF Clip özelliğine çevirir.Form1_ResizeYöntemi, formun Resize olayını işler ve kırpma bölgesini barındırılan öğeye uyacak şekilde boyutlandırır.
Varsayılan özellik eşlemesini kaldırma
RemoveDenetimin ' de yöntemini çağırarak varsayılan özellik eşlemesini kaldırın ElementHostPropertyMap .
Varsayılan özellik eşlemesini kaldırmak için
Aşağıdaki kodu sınıfının tanımına kopyalayın
Form1.// 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 SubRemoveCursorMappingYöntemi, özelliği için varsayılan eşlemeyi siler Cursor .
Varsayılan özellik eşlemesini genişletme
Varsayılan bir özellik eşlemesini kullanabilir ve ayrıca kendi eşlemesiyle genişletebilirsiniz.
Varsayılan bir özellik eşlemesini genişletmek için
Aşağıdaki kodu sınıfının tanımına kopyalayın
Form1.// 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 SubExtendBackColorMappingYöntemi, var olan özellik eşlemesine özel bir özellik Çeviricisi ekler BackColor .OnBackColorChangeYöntemi, barındırılan denetimin özelliğine belirli bir görüntü atar Background .OnBackColorChangeYöntemi, varsayılan özellik eşleme uygulandıktan sonra çağrılır.
Özellik Eşlemelerinizi başlatın
Aşağıdaki kodu sınıfının tanımına kopyalayın
Form1.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 SubForm1_LoadYöntemi Load olayını işler ve aşağıdaki başlatmayı gerçekleştirir.WPF öğesi oluşturur Button .
Özellik eşlemelerini ayarlamak için izlenecek yolda daha önce tanımladığınız yöntemleri çağırır.
Eşlenen özelliklere ilk değerleri atar.
Uygulamayı derleyip çalıştırmak için F5'e basın.