مشاركة عبر


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

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

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

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

  • تعريف تخطيط التطبيق .

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

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

  • إستبدال تعيين خاصية افتراضي.

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

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

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

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

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

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

  • Visual Studio 2008.

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

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

  1. إنشاء مشروع التطبيق WPF باسم PropertyMappingWithElementHost .

  2. في "مستكشف الحلول" قم بإضافة مرجع إلى تجميع WindowsFormsIntegration يسمى WindowsFormsIntegration.dll.

  3. في "مستكشف الحلول" ، قم بإضافة مراجع إلى التجميعات System.Drawing و System.Windows.Forms.

تعريف تخطيط التطبيق .

يستخدم المستند المبني على WPF عنصر WindowsFormsHost لاستضافة عنصر تحكم Windows Forms .

لتعريف تخطيط التطبيق

  1. قم بفتح Window1.xaml في ال مصمم WPF.

  2. إستبدل التعليمة البرمجية الموجودة بالتعليمة البرمجية التالية:

    <Window x:Class="PropertyMappingWithWfh.Window1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://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>
    
    <Window x:Class="Window1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://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>
    
  3. افتح Window1.xaml.cs في محرر تعليمات برمجية.

  4. في أعلى الملف ، قم باستيراد مساحات الأسماء التالية.

    Imports System.Drawing
    Imports System.Drawing.Drawing2D
    Imports System.Windows.Forms
    Imports System.Windows.Forms.Integration
    
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;
    using System.Windows.Forms.Integration;
    

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

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

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

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

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

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

    يترجم أسلوب OnClipChange خاصية Clip الي خاصية Windows Forms Region

    أسلوب Window1_SizeChanged يقوم بمعالجة الحدث SizeChanged الخاص بالإطار و تغيير حجم منطقة اللقطة لاحتواء إطار التطبيق.

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

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

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

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

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

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

إستبدال تعيين الخاصية الافتراضي.

قم باستبدال تعيين الخاصية الافتراضي بواسطة إزالة التعيين الافتراضي و استدعاء اسلوب Add على العنصر WindowsFormsHost و منه PropertyMap.

لإستبدال تعيين الخاصية الافتراضي.

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

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

    يقوم أسلوب ReplaceFlowDirectionMapping باستبدال التعيين الافتراضي لخاصية FlowDirection .

    يترجم أسلوب OnFlowDirectionChange خاصية FlowDirection الي خاصية Windows Forms RightToLeft

    يعالج الأسلوب cb_CheckedChanged الحدث CheckedChanged على عنصر التحكم CheckBox . يقوم بتعيين خاصية FlowDirection استناداً إلى قيمة الخاصية CheckState .

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

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

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

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

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

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

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

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

إعداد تعيينات الخاصية عن طريق استدعاء أساليب تم وصفها مسبقاً في معالج الحدث Loaded .

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

  1. قم بنسخ التعليمات البرمجية التالية في تعريف فئة 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 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 Sub
    
    // 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();
    }
    

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

    • يقوم بإنشاء عنصر تحكم Windows Forms CheckBox

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

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

  2. اضغط F5 لإنشاء التطبيق وتشغيله. انقر فوق خانة الاختيار لمشاهدة تأثير التعيين FlowDirection . عند النقر فوق خانة الاختيار ، يعكس التخطيط اتجاه يسار-يمين الخاص به .

راجع أيضًا:

المهام

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

المرجع

WindowsFormsHost.PropertyMap

ElementHost.PropertyMap

WindowsFormsHost

المبادئ

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

موارد أخرى

مصمم WPF

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