مشاركة عبر


الإرشادات التفصيلية: تعيين الخصائص باستخدام عنصر التحكم ElementHost

توضح هذه الإرشادات التفصيلية كيفية استخدام خاصية PropertyMap لتعيين خصائص Windows Forms إلى الخصائص المقابلة لعنصر WPF المستضيف.

تتضمن المهام الموضحة في هذه الإرشادات التفصيلية ما يلي:

  • إنشاء المشروع

  • تعريف خاصية تعيين جديدة.

  • إزالة خاصية التعيين الافتراضية.

  • توسيع خاصية التعيين الافتراضية.

‏‫للحصول على قائمة كاملة للتعليمات البرمجية للمهام الموضحة في هذه الإرشادات التفصيلية راجع خصائص التعيينباستخدام نموذج التحكم ElementHost.

في حالة الانتهاء ، سيكون بإمكانك تعيين خصائص Windows Forms المناظرة لخصائص WPF على العنصر المستضاف.

لاحظ . قد تختلف مربعات الحوار وأوامر القائمة التي تشاهدها عن تلك الموصوفة في التعليمات اعتماداً على الإعدادات النشطة أو الإصدار الخاص بك. لتغيير الإعدادات الخاصة بك, اختر إعدادات الاستيراد و التصدير ضمن القائمة أدوات . لمزيد من المعلومات، راجع العمل مع إعدادات.

المتطلبات الأساسية

تحتاج إلى المكونات التالية لاستكمال هذه الإرشادات التفصيلية:

  • Visual Studio 2008.

إنشاء المشروع

لإنشاء المشروع

  1. إنشاء مشروع التطبيق Windows Forms باسم PropertyMappingWithElementHost. لمزيد من المعلومات، راجع كيفية القيام بما يلي: إنشاء مشروع تطبيقات Windows.

  2. في "مستكشف الحلول" اضافة ‏‫مراجع للتجميعات WPF التالية.

    • PresentationCore

    • PresentationFramework

    • WindowsBase

    • WindowsFormsIntegration

  3. قم بنسخ التعليمات البرمجية التالية ولصقها في بداية Form1 التعليمات البرمجية للملف.

    Imports System.Windows
    Imports System.Windows.Media
    Imports System.Windows.Media.Imaging
    Imports System.Windows.Forms.Integration
    
    using System.Windows;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Forms.Integration;
    
  4. افتح Form1 في مصمم Windows Forms . انقر نقراً مزدوجاً فوق النموذج لاضافة معالج أحداث للحدث Load .

  5. إرجع لمصمم Windows Forms و أضف معالج أحداث للحدث الخاص بالنموذج Resize . لمزيد من المعلومات، راجع كيفية القيام بما يلي: إنشاء معالجات الأحداث باستخدام "مصمم".

  6. ‏‫قم بتعريف حقل ElementHost في الفئة Form1.

    Private elemHost As ElementHost = Nothing
    
    ElementHost elemHost = null;
    

تعريف خاصية تعيين جديدة.

يوفر عنصر التحكم ElementHost عدة خواص تعينية افتراضية . أضيف خاصية تعيين جديدة عن طريق استدعاء الطريقة Add على عنصر التحكم ElementHost الخاص بPropertyMap.

لتعريف خاصية تعيين جديدة

  1. قم بنسخ التعليمات البرمجية التالية في تعريف فئة Form1 .

    ' 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
    
    // 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;
    }
    

    يضيف أسلوب AddMarginMapping تعيين جديد لـخاصية Margin .

    يترجم أسلوب OnMarginChange خاصية Margin الي خاصية WPF Margin

  2. قم بنسخ التعليمات البرمجية التالية في تعريف فئة Form1 .

    ' 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
    
        Me.OnRegionChange(elemHost, "Region", Nothing)
    
    End Sub
    
    // 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);
    }
    

    يضيف أسلوب AddRegionMapping تعيين جديد لـخاصية Region .

    يترجم أسلوب OnRegionChange خاصية Region الي خاصية WPF Clip

    يعالج أسلوب Form1_Resize للنموذج ، الحدث Resize و يغير حجم منطقة الاقتصاص لاحتواء عنصر المستضاف.

إزالة خاصية تعيين افتراضية.

لازالة خاصية تعيين افتراضية و ذلك عن طريق استدعاء الطريقة Remove على عنصر التحكم ElementHost الخاص بPropertyMap.

لازالة خاصية تعيين افتراضية.

  • قم بنسخ التعليمات البرمجية التالية في تعريف فئة Form1 .

    ' The RemoveCursorMapping method deletes the default
    ' mapping for the Cursor property.
    Private Sub RemoveCursorMapping()
        elemHost.PropertyMap.Remove("Cursor")
    End Sub
    
    // The RemoveCursorMapping method deletes the default
    // mapping for the Cursor property.
    private void RemoveCursorMapping()
    {
        elemHost.PropertyMap.Remove("Cursor");
    }
    

    يحذف أسلوب RemoveCursorMapping التعيين الافتراضي لخاصية Cursor .

توسيع خاصية تعيين افتراضية.

يمكنك استخدام خاصية التعيين الافتراضي و أيضاً توسيعها بالتعيين الخاص بك.

لتوسيع خاصية تعيين افتراضية.

  • قم بنسخ التعليمات البرمجية التالية في تعريف فئة Form1 .

    ' 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
    
    // 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;
    }
    

    يضيف أسلوب ExtendBackColorMapping خاصية المترجم المخصصة، لخاصية التعيين BackColor الموجودة بالفعل

    يعيّن أسلوب OnBackColorChange صورة معينة إلى خاصية Background الخاصة بعنصر التحكم المضيفة. يستدعي اسلوب OnBackColorChange بعد تطبيق خاصية التعيين الافتراضي .

تهيئة خصائص التعيين الخاص بك

لتهيئة خصائص التعيين الخاص بك

  1. قم بنسخ التعليمات البرمجية التالية في تعريف فئة Form1 .

    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
    
    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;
    }
    

    يقوم أسلوب Form1_Load بمعالجة الحدث Load و ينفذ التهيئة التالية.

    • إنشاء عنصر WPF Button .

    • قم باستدعاء الأساليب المعرفة مسبقًا في الإرشادات التفصيلية لإعداد الخصائص التعينية.

    • يقوم بتعيين القيم الأولية للخصائص التي تم تعيينها.

  2. اضغط F5 لإنشاء التطبيق وتشغيله.

راجع أيضًا:

المرجع

ElementHost.PropertyMap

WindowsFormsHost.PropertyMap

WindowsFormsHost

المبادئ

تعيين خاصية WPF و Windows Forms

الإرشادات التفصيلية: استضافة عنصر تحكم WPF في نماذج النوافذ

موارد أخرى

مصمم WPF

الترحيل و إمكانية التشغيل التفاعلى