مشاركة عبر


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

توفر Windows Presentation Foundation (WPF) بيئة منسق لإنشاء تطبيقات. ومع ذلك، عند وجود استثمار حقيقية في Windows Forms البرمجية، يمكن أن يكون أكثر فعاليةل إعادة استخدام الأقل بعض تلك التعليمات البرمجية في الخاص بك WPF التطبيق بدلاً من اعادة كتابتها من البداية. السيناريو الأكثر شيوعاً عندما يكون لديك الموجودة المخصصة Windows Forms عناصر التحكم. في some cases, you might not even have الوصول إلى the المصدر تعليمات برمجية for these عناصر التحكم. WPF provides a straightforward إجراء for hosting such عناصر التحكم في a WPF تطبيق. على سبيل المثال، يمكنك استخدام WPF للملفات لمعظم البرمجة أثناء المضيف الخاص بك متخصصة System.Windows.Forms.DataGridView عناصر التحكم.

هذه الإرشادات التفصيلية خطوات خلال أحد تطبيقات التي تستضيف مركب Windows Forms التحكم الموجودة في WPF صفحة. ويمكن تمديد هذا الإجراء عامة لتطبيقات أكثر تعقيدا والضوابط.

تنقسم ‏‫الإرشادات التفصيلية‬ إلى قسمين. الأول يصف بشكل موجز تنفيذ صفحة Windows Forms. يناقش القسم الثاني بالتفصيل كيفية استضافة الصفحة في تطبيق WPF, استقبال الأحداث من الصفحة، و الوصول إلى بعض خصائص الصفحة.

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

  • تنفيذ أشكال التحكم فى ويندوز.

  • تنفيذ التطبيق المضيف صواب البنية الالاساسيةة

للحصول على قائمة كاملة من التعليمات البرمجية للمهام الموضحة في هذه الإرشادات التفصيلية راجع Hosting a WPF Composite Control in Windows Froms .

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

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

  • Visual Studio 2008.

تنفيذ أشكال التحكم فى ويندوز.

Windows Forms االتحكم المستخدمة في هذا المثال هو نموذج إدخال البيانات البسيطة. هذا النموذج يأخذ اسم المستخدم وعنوانه ويستخدم ثم حدث مخصص لعودة تلك المعلومات إلى المضيف. يُظهر التوضيح التالى الشكل المقدم .

عنصر تحكم Windows Forms

عنصر تحكم Windows Forms بسيط

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

لبدء المشروع:

  1. شغل Microsoft Visual Studio، و افتح مربع حوار مشروع جديد.

  2. حدد C# مشاريع واجهة المستخدم Windows مكتبة النماذج على التحكم.

  3. الاسم الجديد المشروع عناصر التحكم الخاصة ثم انقر فوق موافق لإنشاء المشروع. المشروع الافتراضي يحتوي على عنصر تحكم واحد اسمه UserControl1.

  4. تغيير القيمة UserControl1 الى MyControl1.

يجب أن يكون للمشروع الخاص بك مراجع إلى نظام DLLs التالي. إذا لم يتم تضمين أي من هذه DLLs افتراضياً، قم بإضافتهم إلى المشروع الخاص بك.

  • System

  • بيانات النظام

  • رسم النظام.

  • اطارات رسم النظام

  • نظام .Xml.

إضافة عناصر تحكم إلى ورقة العمل.

لإضافة عناصر تحكم إلى الصفحة:

  • فتح مصمم ل1 / <codeInline>1MyControl12 <codeInline.

وضع ستة عناصر التحكم الخاصة بها المقابل System.Windows.Forms.Label و System.Windows.Forms.TextBox عناصر تحكم بحجم و مرتبة كما في الرسم التوضيحي السابق على النموذج. في المثال، TextBox تسمية عناصر التحكم:

  • txtName

  • txtAddress

  • txtCity

  • txtState

  • txtZip

تطبيق اثنان System.Windows.Forms.Button تسمى عناصر تحكم موافق و إلغاء اثنين. في المثال، أسماء الازرار هي btnOK و btnCancel على الترتيب.

تنفيذ قانون دعم

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

Public Delegate Sub MyControlEventHandler(ByVal sender As Object, ByVal args As MyControlEventArgs)
Public Event OnButtonClick As MyControlEventHandler
public delegate void MyControlEventHandler(object sender, MyControlEventArgs args);
public event MyControlEventHandler OnButtonClick;

MyControlEventArgs فئة يحتوي على معلومات يمكن إرجاعها إلى المضيف. تطبيق فئة التالية إلى مساحة الاسم الخاصة بالنموذج.

Public Class MyControlEventArgs
    Inherits EventArgs
    Private _Name As String
    Private _StreetAddress As String
    Private _City As String
    Private _State As String
    Private _Zip As String
    Private _IsOK As Boolean


    Public Sub New(ByVal result As Boolean, ByVal name As String, ByVal address As String, ByVal city As String, ByVal state As String, ByVal zip As String) 
        _IsOK = result
        _Name = name
        _StreetAddress = address
        _City = city
        _State = state
        _Zip = zip

    End Sub


    Public Property MyName() As String 
        Get
            Return _Name
        End Get
        Set
            _Name = value
        End Set
    End Property

    Public Property MyStreetAddress() As String 
        Get
            Return _StreetAddress
        End Get
        Set
            _StreetAddress = value
        End Set
    End Property

    Public Property MyCity() As String 
        Get
            Return _City
        End Get
        Set
            _City = value
        End Set
    End Property

    Public Property MyState() As String 
        Get
            Return _State
        End Get
        Set
            _State = value
        End Set
    End Property

    Public Property MyZip() As String 
        Get
            Return _Zip
        End Get
        Set
            _Zip = value
        End Set
    End Property

    Public Property IsOK() As Boolean 
        Get
            Return _IsOK
        End Get
        Set
            _IsOK = value
        End Set
    End Property
End Class
public class MyControlEventArgs : EventArgs
{
    private string _Name;
    private string _StreetAddress;
    private string _City;
    private string _State;
    private string _Zip;
    private bool _IsOK;

    public MyControlEventArgs(bool result,
                                   string name,
                                   string address,
                                   string city,
                                   string state,
                                   string zip)
    {
        _IsOK = result;
        _Name = name;
        _StreetAddress = address;
        _City = city;
        _State = state;
        _Zip = zip;
    }

    public string MyName
    {
        get { return _Name; }
        set { _Name = value; }
    }
    public string MyStreetAddress
    {
        get { return _StreetAddress; }
        set { _StreetAddress = value; }
    }
    public string MyCity
    {
        get { return _City; }
        set { _City = value; }
    }
    public string MyState
    {
        get { return _State; }
        set { _State = value; }
    }
    public string MyZip
    {
        get { return _Zip; }
        set { _Zip = value; }
    }
    public bool IsOK
    {
        get { return _IsOK; }
        set { _IsOK = value; }
    }
}

عند قيام المستخدم بالنقر فوق " موافق " أو " إلغاء الأمر للازرار ، Control.Click إنشاء معالجات الأحداث MyControlEventArgs الكائن الذي يحتوي على البيانات وتقوم بإصدار OnButtonClick الحدث. الاختلاف الوحيد بين جهازي معالجات هو وسيطة الحدث IsOK الخاصية. تتيح هذه الخاصية المضيف لتحديد صواب تم الن تعيين true لـ موافق الزر ، و false للحصول إلغاء زر. ويظهر المثال التالي رمز معالجات اثنين زر. تطبيق هذه التعليمة البرمجية إلى فئة وضعه أسفل تعريف الحدث "و" المفوض هو مبين في المثال رمز الأول في هذا القسم.

    Private Sub OKButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click

        Dim retvals As New MyControlEventArgs(True, txtName.Text, txtAddress.Text, txtCity.Text, txtState.Text, txtZip.Text)
        RaiseEvent OnButtonClick(Me, retvals)

    End Sub


    Private Sub CancelButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancel.Click
        Dim retvals As New MyControlEventArgs(False, txtName.Text, txtAddress.Text, txtCity.Text, txtState.Text, txtZip.Text)
        RaiseEvent OnButtonClick(Me, retvals)

    End Sub
End Class
private void OKButton_Click(object sender, System.EventArgs e)
{

    MyControlEventArgs retvals = new MyControlEventArgs(true,
                                                         txtName.Text,
                                                         txtAddress.Text,
                                                         txtCity.Text,
                                                         txtState.Text,
                                                         txtZip.Text);
    OnButtonClick(this, retvals);
}

private void CancelButton_Click(object sender, System.EventArgs e)
{
    MyControlEventArgs retvals = new MyControlEventArgs(false,
                                                         txtName.Text,
                                                         txtAddress.Text,
                                                         txtCity.Text,
                                                         txtState.Text,
                                                         txtZip.Text);
    OnButtonClick(this, retvals);
}

منح التجميع اسم قوي وبناء التجميع

للحصول على هذا التجميع المراد الرجوع إليها بواسطة WPF التطبيق، فيجب أن يكون اسم قوى. لإنشاء اسم واضح إنشاء مفتاح ملف Sn.exe وإضافته إلى ملف AssemblyInfo.cs المشروع الخاص بك.

  1. افتح موجه الأوامر Visual Studio. انقر فوق ابدأثم أشر إلى كافة البرامج ، أشر إلى Microsoft Visual Studio 2010 أشر إلى أدوات Visual Studio 2010 , ثم انقر فوق موجه أوامر Visual Studio . هذا تطلق إطار وحدة مع متغيرات البيئة المخصصة.

  2. في موجه الأوامر ، استخدم "سي دي" الأمر للذهاب الى مجلد المشروع.

  3. إنشاء ملف مفتاح تسمية MyControls.snk عن طريق تشغيل الأمر التالي.

    Sn.exe -k MyControls.snk
    
  4. لتضمين ملف رئيسى المفتاح في المشروع الخاص بك - انقر فوق اسم المشروع في "مستكشف الحلول" وافتح مربع الحوار " خصائص". حدد علامة التبويب التوقيع ثم أدخل اسم من ملف المفتاح.

  5. بنية التجميع. سوف ينتج الإنشاء صواب المسمى MyControls. صواب.

تنفيذ التطبيق المضيف صواب البنية الالاساسيةة

WPF لاستضافة يستخدم التطبيق WindowsFormsHost التحكم فى المضيف MyControl1. يعالج التطبيق OnButtonClick الحدث لتلقي بيانات من عنصر التحكم. لدى أيضاً مجموعة من أزرار الخيارات التي تمكنك من تغيير بعض خصائص عنصر التحكم من WPF صواب. يبين الرسم التوضيحي التالي في انتهاء تطبيق.

يظهر عنصر التحكم المضمنة التطبيق كاملة في البنية الأساسية لعرض برامج Windows صفحة

عنصر تحكم مُضمّن في صفحة WPF

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

لبدء المشروع:

  1. فتح Visual Studio ، حدد مشروع جديد.

  2. قم بتحديد القالب تطبيق مستعرض WPF .

  3. اسم المشروع WpfHostثم انقر فوق موافق لفتح المشروع.

انك تحتاج أيضاً إلى إضافة مرجع إلى DLL التي تحتوي على صفحة MyControl1. إن أبسط طريقة إلى اضافة يكون المرجع كما يلي.

  1. في مستكشف الحلول انقر بزر الماوس الأيمن على المشروع LinqToTerraServerProvider وانقر فوق إضافة مرجع خدمة.

  2. انقر فوق التبويب استعراض ثم استعرض بحثاً عن عنصر تحكم نموذج Windows الخاص إخراج المجلد. للحصول على هذه العينة هذا المجلد هو MyControls\bin\Debug.

  3. حدد ملف DLL الذي يحتوي على عنصر التحكم ثم انقر فوق موافق لإضافته الى قائمة مراجع. للحصول على استضافة تحكم مركب نماذج Windows في نموذج WPF ، يسمى DLL هذه MyControls.dll.

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

تطبيق تنفيذ التصميم الأساسي

واجهة المستخدم (UI) المضيف يتم تنفيذ التطبيق في Page1.xaml. يحتوي هذا الملف على Extensible Application Markup Language (XAML) العلامات بتعريف والتخطيط المضيفين Windows Forms عنصر التحكم. الصفحة تنقسم إلى ثلاث مناطق:

  • اللوحة تحكم خصائص الذي يحتوي على مجموعة من أزرار الخيارات التي يمكنك استخدامها لتعديل الخصائص المختلفة تمت استضافته للتحكم.

  • بيانات من التحكم لوحة يحتوي على عدة TextBlock الذي يعرض البيانات التي يتم إرجاعها من عنصر التحكم المضيفة.

  • واستضافت السيطرة على نفسها.

يتم إظهار رمز التخطيط الأساسي في مثال التعليمة البرمجية التالي. رمز العلامات مطلوبة لاستضافة MyControl1 حذف من هذا المثال ولكن سيتم مناقشتها لاحقاً. استبدل هذه التعليمة البرمجية بالتعليمة البرمجية التالية:

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="WpfHost.Page1"
      xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
      Loaded="Init">
  <DockPanel>
    <DockPanel.Resources>
      <Style x:Key="inlineText" TargetType="{x:Type Inline}">
        <Setter Property="FontWeight" Value="Normal"/>
      </Style>
      <Style x:Key="titleText" TargetType="{x:Type TextBlock}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="Margin" Value="10,5,10,0"/>
      </Style>
    </DockPanel.Resources>

    <StackPanel Orientation="Vertical"
                DockPanel.Dock="Left"
                Background="Bisque"
                Width="250">

      <TextBlock  Margin="10,10,10,10"
                  FontWeight="Bold"
                  FontSize="12">Control Properties</TextBlock>
      <TextBlock Style="{StaticResource titleText}">Background Color</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalBackColor"
                    IsChecked="True"
                    Click="BackColorChanged">Original</RadioButton>
        <RadioButton Name="rdbtnBackGreen"
                    Click="BackColorChanged">LightGreen</RadioButton>
        <RadioButton Name="rdbtnBackSalmon"
                    Click="BackColorChanged">LightSalmon</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Foreground Color</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalForeColor"
                    IsChecked="True"
                    Click="ForeColorChanged">Original</RadioButton>
        <RadioButton Name="rdbtnForeRed"
                    Click="ForeColorChanged">Red</RadioButton>
        <RadioButton Name="rdbtnForeYellow"
                    Click="ForeColorChanged">Yellow</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Family</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalFamily"
                     IsChecked="True"
                    Click="FontChanged">Original</RadioButton>
        <RadioButton Name="rdbtnTimes"
                    Click="FontChanged">Times New Roman</RadioButton>
        <RadioButton Name="rdbtnWingdings"
                    Click="FontChanged">Wingdings</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Size</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalSize"
                    IsChecked="True"
                    Click="FontSizeChanged">Original</RadioButton>
        <RadioButton Name="rdbtnTen"
                    Click="FontSizeChanged">10</RadioButton>
        <RadioButton Name="rdbtnTwelve"
                    Click="FontSizeChanged">12</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Style</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnNormalStyle"
                     IsChecked="True"
                     Click="StyleChanged">Original</RadioButton>
        <RadioButton Name="rdbtnItalic"
                     Click="StyleChanged">Italic</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Weight</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalWeight"
                     IsChecked="True"
                   Click="WeightChanged">
          Original
        </RadioButton>
        <RadioButton Name="rdbtnBold"
                   Click="WeightChanged">Bold</RadioButton>
      </StackPanel>
    </StackPanel>

    <WindowsFormsHost Name="wfh"
                     DockPanel.Dock="Top"
                     Height="300">
      <mcl:MyControl1 Name="mc"/>
    </WindowsFormsHost>

    <StackPanel Orientation="Vertical"
                Height="Auto"
                Background="LightBlue">
      <TextBlock Margin="10,10,10,10"
            FontWeight="Bold"
            FontSize="12">Data From Control</TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Name: <Span Name="txtName" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Street Address: <Span Name="txtAddress" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        City: <Span Name="txtCity" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        State: <Span Name="txtState" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Zip: <Span Name="txtZip" Style="{StaticResource inlineText}"/>
      </TextBlock>
    </StackPanel>
  </DockPanel>
</Page>
<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="Page1"
      xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
      Loaded="Init">
  <DockPanel>
    <DockPanel.Resources>
      <Style x:Key="inlineText" TargetType="{x:Type Inline}">
        <Setter Property="FontWeight" Value="Normal"/>
      </Style>
      <Style x:Key="titleText" TargetType="{x:Type TextBlock}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="Margin" Value="10,5,10,0"/>
      </Style>
    </DockPanel.Resources>

    <StackPanel Orientation="Vertical"
                DockPanel.Dock="Left"
                Background="Bisque"
                Width="250">

      <TextBlock  Margin="10,10,10,10"
                  FontWeight="Bold"
                  FontSize="12">Control Properties</TextBlock>
      <TextBlock Style="{StaticResource titleText}">Background Color</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalBackColor"
                    IsChecked="True"
                    Click="BackColorChanged">Original</RadioButton>
        <RadioButton Name="rdbtnBackGreen"
                    Click="BackColorChanged">LightGreen</RadioButton>
        <RadioButton Name="rdbtnBackSalmon"
                    Click="BackColorChanged">LightSalmon</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Foreground Color</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalForeColor"
                    IsChecked="True"
                    Click="ForeColorChanged">Original</RadioButton>
        <RadioButton Name="rdbtnForeRed"
                    Click="ForeColorChanged">Red</RadioButton>
        <RadioButton Name="rdbtnForeYellow"
                    Click="ForeColorChanged">Yellow</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Family</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalFamily"
                     IsChecked="True"
                    Click="FontChanged">Original</RadioButton>
        <RadioButton Name="rdbtnTimes"
                    Click="FontChanged">Times New Roman</RadioButton>
        <RadioButton Name="rdbtnWingdings"
                    Click="FontChanged">Wingdings</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Size</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalSize"
                    IsChecked="True"
                    Click="FontSizeChanged">Original</RadioButton>
        <RadioButton Name="rdbtnTen"
                    Click="FontSizeChanged">10</RadioButton>
        <RadioButton Name="rdbtnTwelve"
                    Click="FontSizeChanged">12</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Style</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnNormalStyle"
                     IsChecked="True"
                     Click="StyleChanged">Original</RadioButton>
        <RadioButton Name="rdbtnItalic"
                     Click="StyleChanged">Italic</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Weight</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalWeight"
                     IsChecked="True"
                   Click="WeightChanged">
          Original
        </RadioButton>
        <RadioButton Name="rdbtnBold"
                   Click="WeightChanged">Bold</RadioButton>
      </StackPanel>
    </StackPanel>

    <WindowsFormsHost Name="wfh"
                     DockPanel.Dock="Top"
                     Height="300">
      <mcl:MyControl1 Name="mc"/>
    </WindowsFormsHost>

    <StackPanel Orientation="Vertical"
                Height="Auto"
                Background="LightBlue">
      <TextBlock Margin="10,10,10,10"
            FontWeight="Bold"
            FontSize="12">Data From Control</TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Name: <Span Name="txtName" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Street Address: <Span Name="txtAddress" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        City: <Span Name="txtCity" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        State: <Span Name="txtState" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Zip: <Span Name="txtZip" Style="{StaticResource inlineText}"/>
      </TextBlock>
    </StackPanel>
  </DockPanel>
</Page>

الأول StackPanelيحتوي على عنصر عدة مجموعات من RadioButton عناصر التحكم التي تمكنك من تعديل الخصائص الافتراضية المختلفة التحكم المضيفة. متبوعاً في WindowsFormsHost العنصر الذي يستضيف MyControl1. StackPanel يحتوي العنصر على عدة النهائية TextBlock العناصر التي تعرض البيانات التي تم إرجاعها بواسطة تمت استضافته التحكم. ترتيب العناصر و في Dock و Height إعدادات السمات تضمين تمت استضافته إلى الصفحة التي تحتوي على لم فجوات أو تشويه.

المضيفة لعنصر تحكم

إصدار المحرر التالية من المثال التعليمات البرمجية السابق تركز على عناصر مطلوبة صواب لاستضافة MyControl1.

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="WpfHost.Page1"
      xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
      Loaded="Init">


...


<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="Page1"
      xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
      Loaded="Init">


...


<WindowsFormsHost Name="wfh"
                 DockPanel.Dock="Top"
                 Height="300">
  <mcl:MyControl1 Name="mc"/>
</WindowsFormsHost>


...


<WindowsFormsHost Name="wfh"
                 DockPanel.Dock="Top"
                 Height="300">
  <mcl:MyControl1 Name="mc"/>
</WindowsFormsHost>

xmlns تعيين مساحة الاسم لإنشاء مرجع MyControls مساحة الاسم التي تحتوي على عنصر التحكم المضيفة. هذا التعيين تمكنك لتمثيل MyControl1 في XAML كـ <mcl:MyControl1>.

عنصرين في المثال رمز التعامل مع استضافة :

  • WindowsFormsHost يمثلWindowsFormsHost العنصر الذي يتيح لك المضيفWindows Forms التحكم الموجودة فيWPF الصفحة.

  • mcl:MyControl1 ، الذي يمثلMyControl1 ، تتم إضافة WindowsFormsHost مجموعة تابعة العنصر. كنتيجة ، هذا Windows Forms يتم تقديم عنصر التحكم كجزء من WPF يمكن الاتصال الصفحة و 
 عنصر التحكم من الصفحة.

تنفيذ المدونة ، وراء ملف

رمز الملف وراء - behind procedural يحتوي على الملف Page1.xaml.cs ، الذي يطبق وظيفة واجهة المستخدم تمت مناقشتها في المقطع السابق. المهام الأساسية:

  • إرفاق معالج أحداث الى MyControl1 الخاص OnButtonClick الحدث.

  • تعديل خصائص متعددة MyControl1 ، استناداً إلى كيفية هي مجموعة أزرار الخيارات مجموعة.

  • عرض البيانات التي تم جمعها بواسطة عنصر التحكم.

تهيئة التطبيق

يتم تضمين التعليمات البرمجية التهيئة في معالج أحداث الصفحة Loaded الحدث ويعلق على معالج الحدث لعنصر التحكم OnButtonClick الحدث. قم بنسخ التعليمة البرمجية التالية في Page1 الفئة في Page1.xaml.cs.

Class Page1
    Inherits Page

    Private app As Application
    Private myWindow As NavigationWindow
    Private initFontWeight As FontWeight
    Private initFontSize As [Double]
    Private initFontStyle As FontStyle
    Private initBackBrush As SolidColorBrush
    Private initForeBrush As SolidColorBrush
    Private initFontFamily As FontFamily
    Private UIIsReady As Boolean = False


    Private Sub Init(ByVal sender As Object, ByVal e As RoutedEventArgs)
        app = System.Windows.Application.Current
        myWindow = CType(app.MainWindow, NavigationWindow)
        myWindow.SizeToContent = SizeToContent.WidthAndHeight
        wfh.TabIndex = 10
        initFontSize = wfh.FontSize
        initFontWeight = wfh.FontWeight
        initFontFamily = wfh.FontFamily
        initFontStyle = wfh.FontStyle
        initBackBrush = CType(wfh.Background, SolidColorBrush)
        initForeBrush = CType(wfh.Foreground, SolidColorBrush)

        Dim mc As MyControl1 = wfh.Child

        AddHandler mc.OnButtonClick, AddressOf Pane1_OnButtonClick 
        UIIsReady = True

    End Sub
public partial class Page1 : Page
{
    private Application app;
    private NavigationWindow myWindow;
    FontWeight initFontWeight;
    Double initFontSize;
    FontStyle initFontStyle;
    SolidColorBrush initBackBrush;
    SolidColorBrush initForeBrush;
    FontFamily initFontFamily;
    bool UIIsReady = false;

    private void Init(object sender, EventArgs e)
    {
        app = System.Windows.Application.Current;
        myWindow = (NavigationWindow)app.MainWindow;
        myWindow.SizeToContent = SizeToContent.WidthAndHeight;
        wfh.TabIndex = 10;
        initFontSize = wfh.FontSize;
        initFontWeight = wfh.FontWeight;
        initFontFamily = wfh.FontFamily;
        initFontStyle = wfh.FontStyle;
        initBackBrush = (SolidColorBrush)wfh.Background;
        initForeBrush = (SolidColorBrush)wfh.Foreground;
        (wfh.Child as MyControl1).OnButtonClick += new MyControl1.MyControlEventHandler(Pane1_OnButtonClick);
        UIIsReady = true;
    }

بسبب XAML إضافة التعليمات البرمجية التي تمت مناقشتها سابقًا MyControl1 الى WindowsFormsHost مجموعة عنصر تابع العنصر الذي يمكن تحويل WindowsFormsHost العنصر Child صواب الحصول على المرجع صواب MyControl1. ثم يمكنك استخدام الإشارة إلى أن نعلق على معالج الحدث OnButtonClick.

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

وفي التعامل مع الحدث انقر فوق زر

MyControl1 رفعOnButtonClick الحدث عندما يقوم المستخدم بالنقر فوق أحد أزرار قم بإضافة التعليمات البرمجية التالية إلى فئة Page1 الخاصة بك.

    'Handle button clicks on the Windows Form control
    Private Sub Pane1_OnButtonClick(ByVal sender As Object, ByVal args As MyControlEventArgs) 
        txtName.Inlines.Clear()
        txtAddress.Inlines.Clear()
        txtCity.Inlines.Clear()
        txtState.Inlines.Clear()
        txtZip.Inlines.Clear()

        If args.IsOK Then
            txtName.Inlines.Add(" " + args.MyName)
            txtAddress.Inlines.Add(" " + args.MyStreetAddress)
            txtCity.Inlines.Add(" " + args.MyCity)
            txtState.Inlines.Add(" " + args.MyState)
            txtZip.Inlines.Add(" " + args.MyZip)
        End If

    End Sub
End Class
//Handle button clicks on the Windows Form control
private void Pane1_OnButtonClick(object sender, MyControlEventArgs args)
{
    txtName.Inlines.Clear();
    txtAddress.Inlines.Clear();
    txtCity.Inlines.Clear();
    txtState.Inlines.Clear();
    txtZip.Inlines.Clear();

    if (args.IsOK)
    {
        txtName.Inlines.Add( " " + args.MyName );
        txtAddress.Inlines.Add( " " + args.MyStreetAddress );
        txtCity.Inlines.Add( " " + args.MyCity );
        txtState.Inlines.Add( " " + args.MyState );
        txtZip.Inlines.Add( " " + args.MyZip );
    }
}

حزم البيانات في مربعات النص MyControlEventArgs الكائن. في حالة قيام المستخدم بالنقر فوق موافق زر ، معالج الأحداث استخراج البيانات ويعرضها في اللوحة أدناه MyControl1.

تعديل خصائص عنصر التحكم

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

Private Sub BackColorChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)

    If sender.Equals(rdbtnBackGreen) Then
        wfh.Background = New SolidColorBrush(Colors.LightGreen)
    ElseIf sender.Equals(rdbtnBackSalmon) Then
        wfh.Background = New SolidColorBrush(Colors.LightSalmon)
    ElseIf UIIsReady = True Then
        wfh.Background = initBackBrush
    End If

End Sub

Private Sub ForeColorChanged(ByVal sender As Object, ByVal e As RoutedEventArgs) 
    If sender.Equals(rdbtnForeRed) Then
        wfh.Foreground = New SolidColorBrush(Colors.Red)
    ElseIf sender.Equals(rdbtnForeYellow) Then
        wfh.Foreground = New SolidColorBrush(Colors.Yellow)
    ElseIf UIIsReady = True Then
        wfh.Foreground = initForeBrush
    End If

End Sub

Private Sub FontChanged(ByVal sender As Object, ByVal e As RoutedEventArgs) 
    If sender.Equals(rdbtnTimes) Then
        wfh.FontFamily = New FontFamily("Times New Roman")
    ElseIf sender.Equals(rdbtnWingdings) Then
        wfh.FontFamily = New FontFamily("Wingdings")
    ElseIf UIIsReady = True Then
        wfh.FontFamily = initFontFamily
    End If

End Sub

Private Sub FontSizeChanged(ByVal sender As Object, ByVal e As RoutedEventArgs) 
    If sender.Equals(rdbtnTen) Then
        wfh.FontSize = 10
    ElseIf sender.Equals(rdbtnTwelve) Then
        wfh.FontSize = 12
    ElseIf UIIsReady = True Then
        wfh.FontSize = initFontSize
    End If

End Sub

Private Sub StyleChanged(ByVal sender As Object, ByVal e As RoutedEventArgs) 
    If sender.Equals(rdbtnItalic) Then
        wfh.FontStyle = FontStyles.Italic
    ElseIf UIIsReady = True Then
        wfh.FontStyle = initFontStyle
    End If

End Sub

Private Sub WeightChanged(ByVal sender As Object, ByVal e As RoutedEventArgs) 
    If sender.Equals(rdbtnBold) Then
        wfh.FontWeight = FontWeights.Bold
    ElseIf UIIsReady = True Then
        wfh.FontWeight = initFontWeight
    End If

End Sub
private void BackColorChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnBackGreen)
        wfh.Background = new SolidColorBrush(Colors.LightGreen);
    else if (sender == rdbtnBackSalmon)
        wfh.Background = new SolidColorBrush(Colors.LightSalmon);
    else if (UIIsReady == true)
        wfh.Background = initBackBrush;
}

private void ForeColorChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnForeRed)
        wfh.Foreground = new SolidColorBrush(Colors.Red);
    else if (sender == rdbtnForeYellow)
        wfh.Foreground = new SolidColorBrush(Colors.Yellow);
    else if (UIIsReady == true)
        wfh.Foreground = initForeBrush;
}

private void FontChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnTimes)
        wfh.FontFamily = new FontFamily("Times New Roman");
    else if (sender == rdbtnWingdings)
        wfh.FontFamily = new FontFamily("Wingdings");
    else if (UIIsReady == true)
        wfh.FontFamily = initFontFamily;
}
private void FontSizeChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnTen)
        wfh.FontSize = 10;
    else if (sender == rdbtnTwelve)
        wfh.FontSize = 12;
    else if (UIIsReady == true)
        wfh.FontSize = initFontSize;
}
private void StyleChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnItalic)
        wfh.FontStyle = FontStyles.Italic;
    else if (UIIsReady == true)
        wfh.FontStyle = initFontStyle;
}
private void WeightChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnBold)
        wfh.FontWeight = FontWeights.Bold;
    else if (UIIsReady == true)
        wfh.FontWeight = initFontWeight;
}

راجع أيضًا:

المهام

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

المرجع

ElementHost

WindowsFormsHost

المبادئ

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

موارد أخرى

مصمم WPF