Aracılığıyla paylaş


İzlenecek yol: ElementHost Denetimini Kullanarak Özellikleri Eşleme

Bu izlenecek yol, Windows Forms özelliklerini barındırılan bir WPF öğesindeki PropertyMap ilgili özelliklerle eşlemek için özelliğinin nasıl kullanılacağını gösterir.

Bu kılavuzda gösterilen görevler şunlardır:

  • Projeyi oluşturma.

  • Yeni özellik eşlemesi tanımlama.

  • Varsayılan özellik eşlemesi kaldırılıyor.

  • Varsayılan özellik eşlemesini genişletme.

İşiniz bittiğinde, Windows Forms özelliklerini barındırılan bir öğedeki ilgili WPF özellikleriyle eşleyebilirsiniz.

Ön koş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

  1. adlı bir Windows Forms Uygulaması projesi PropertyMappingWithElementHostoluşturun.

  2. Çözüm Gezgini aşağıdaki WPF derlemelerine başvurular ekleyin.

    • Presentationcore

    • Presentationframework

    • Windowsbase

    • WindowsFormsIntegration

  3. Aşağıdaki kodu kod dosyasının Form1 en üstüne kopyalayın.

    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
    
  4. Windows Forms Tasarım Aracı açınForm1. Olaya bir olay işleyicisi eklemek için Load forma çift tıklayın.

  5. Windows Forms Tasarım Aracı dönün ve formun Resize olayı için bir olay işleyicisi ekleyin. Daha fazla bilgi için bkz. Nasıl yapılır: Tasarım Aracı Kullanarak Olay İşleyicileri Oluşturma.

  6. sınıfında bir ElementHost alan bildirin Form1 .

    ElementHost elemHost = null;
    
    Private elemHost As ElementHost = Nothing
    

Yeni Özellik Eşlemelerini Tanımlama

Denetim ElementHost birkaç varsayılan özellik eşlemesi sağlar. Denetimin üzerinde ElementHost yöntemini çağırarak Add yeni bir özellik eşlemesi PropertyMapeklersiniz.

Yeni özellik eşlemelerini tanımlamak için

  1. Sınıfın tanımına Form1 aşağıdaki kodu kopyalayın.

    // 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
    

    yöntemi özelliği AddMarginMapping için Margin yeni bir eşleme ekler.

    yöntemi, OnMarginChange özelliğini WPF Margin özelliğine çevirirMargin.

  2. Sınıfın tanımına Form1 aşağıdaki kodu kopyalayın.

    // 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
    

    yöntemi özelliği AddRegionMapping için Region yeni bir eşleme ekler.

    yöntemi, OnRegionChange özelliğini WPF Clip özelliğine çevirirRegion.

    Form1_Resize yöntemi formun Resize olayını işler ve kırpma bölgesini barındırılan öğeye sığacak şekilde boyutlandırabilir.

Varsayılan Özellik Eşlemesini Kaldırma

Denetimin RemovePropertyMapüzerinde yöntemini çağırarak varsayılan özellik eşlemesini ElementHost kaldırın.

Varsayılan özellik eşlemesini kaldırmak için

  • Sınıfın tanımına Form1 aşağıdaki kodu kopyalayın.

    // 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
    

    yöntemi özelliği RemoveCursorMapping için varsayılan eşlemeyi Cursor siler.

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

  • Sınıfın tanımına Form1 aşağıdaki kodu kopyalayın.

    // 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
    

    yöntemi, ExtendBackColorMapping var olan BackColor özellik eşlemesine özel bir özellik çeviricisi ekler.

    yöntemi, OnBackColorChange barındırılan denetimin Background özelliğine belirli bir görüntü atar. Varsayılan OnBackColorChange özellik eşlemesi uygulandıktan sonra yöntemi çağrılır.

Özellik eşlemelerinizi başlatma

  1. Sınıfın tanımına Form1 aşağıdaki kodu kopyalayın.

    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
    

    Form1_Load yöntemi olayı işler Load ve aşağıdaki başlatmayı gerçekleştirir.

    • WPF Button öğesi 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.

  2. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın.

Ayrıca bkz.