مشاركة عبر


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

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

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

ملاحظةملاحظة

الصفحة المستضافة هي ليست عنصر تحكم WPF في الإحساس الصارمة للكلمة.بدلاً من ذلك، هي صفحة WPF عادية التي يتم حزمها في DLL.ومع ذلك، التقنيات لاستضافة عنصر تحكم WPF في نموذج مماثلة لتلك المستخدمة لاستضافة صفحة عادية.راجع تخصيص عنصر التحكم للمناقشة بشكل أكبر عناصر تحكم WPF.

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

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

  • تطبيق صفحة Windows Presentation Foundation.

  • تنفيذ تطبيق مضيف نماذج Windows.

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

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

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

  • Visual Studio 2008.

تطبيق صفحة Windows Presentation Foundation.

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

صفحة Windows Presentation Foundation

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

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

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

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

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

  3. قم بتسمية المشروع الجديد MyControls, و ضعه في مجلد ذو مستوى أعلى المسمى بطريقة مناسبة، على سبيل المثال، WfHostingWpf. لاحقاً، سيتم وضع التطبيق المضيف في هذا المجلد أيضاً. انقر فوق موافق لإنشاء المشروع. يحتوي المشروع الافتراضي على صفحة واحدة باسم Page1.

  4. انقر بزر الماوس الأيمن على اسم المشروع في مستكشف الحل و حدد خصائص.

  5. قم بتعيين نوع الناتج إلى مكتبة الفئات لترجمة الصفحة مثل DLL.

  6. احذف ملفات تعريف التطبيق, MyApp.xaml و MyApp.xaml.cs , من المشروع. تحتاج هذه الملفات فقط إذا كنت تقوم بتنفيذ الصفحة كتطبيق.

ملاحظةملاحظة

عند ترجمة تطبيق WPF كمكتبة فئة, يتعذر تشغيله لعرض الصفحة المقدمة.لهذا السبب، قد تجد أنه ملائم ترك نوع الناتج ك "تطبيق Windows" حتى يتم تنفيذ التطبيق بشكل كامل.يتيح لك هذا التحقق من مظهر الصفحات عن طريق بدء تشغيل التطبيق.عندما تكون راضياً, قم بحذف ملفات تعريف التطبيق و قم بتغيير نوع الناتج إلى "مكتبة الفئة" لترجمتها كـ DLL.

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

  • System

  • PresentationCore

  • PresentationFramework

  • WindowsBase

تطبيق واجهة المستخدم الخاصة بالصفحة

يتم تنفيذ واجهة المستخدم (UI) الخاص بصفحة WPF مع Extensible Application Markup Language (XAML). تم تصميمها لتكون مماثلة في المظهر و الوظيفة إلى عنصر تحكم Windows Forms الذي تم مناقشته في الإرشادات التفصيلية: استضافة عنصر تحكم Windows Forms في WPF. إدخال بيانات واجهة المستخدم الخاص بالصفحة يتكون من خمسة عناصر TextBox. كل عنصر TextBox يحتوي عنصر TextBlock المقترن الذي يخدم كتسمية. يوجد عنصري Button في أسفل الصفحة, موافق و إلغاء الأمر. عندما ينقر المستخدم فوق أي منهم، الصفحة ترفع حدث مخصص لإعادة المعلومات إلى المضيف.

التخطيط الأساسي

عناصر واجهة المستخدم المتنوعة تكون محتواه في عنصر Grid. يمكنك استخدام Gridإلى ترتيب محتويات الصفحة في معظم بنفس الطريقة التي تستخدم Tableعنصر في HTML. WPFيحتوي أيضاTableعنصر، ولكنGridهو أكثر خفيفة ومناسبة بشكل أفضل لمهام تخطيط بسيط.

يظهر المثال التالي التعليمات البرمجية للتخطيط الأساسي. تعرّف هذه التعليمات البرمجية البنية الإجمالية من الصفحة عن طريق تحديد عدد الصفوف و الأعمدة في عنصر Grid العنصر. استخدم ذلك لاستبدال التعليمات البرمجية في Page1.xaml.

<Grid xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="MyControls.Page1"
      Background="#DCDCDC"
      Width="375"
      Height="250"
      Name="rootElement"
      Loaded="Init">


...


<Grid.ColumnDefinitions>
  <ColumnDefinition Width="Auto" />
  <ColumnDefinition Width="Auto" />
  <ColumnDefinition Width="Auto"/>
  <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>

<Grid.RowDefinitions>
  <RowDefinition Height="Auto" />
  <RowDefinition Height="Auto" />
  <RowDefinition Height="Auto" />
  <RowDefinition Height="Auto" />
  <RowDefinition Height="Auto" />
  <RowDefinition Height="Auto" />
</Grid.RowDefinitions>

إضافة عناصر TextBox و TextBlock إلى شبكة

قم بوضع عنصر واجهة المستخدم في الشبكة عن طريق تعيين سمات RowProperty و ColumnProperty الخاصة بالعنصر إلى رقم الصف و العمود المناسب. تذكر أن ترقيم الأعمدة والصفوف يستند إلى الصفر. يمكن أن يكون لديك عنصر ممتد عبر عدة أعمدة بواسطة إعداد سمة ColumnSpanProperty الخاصة به. راجع كيفية القيام بما يلي: إنشاء عنصر شبكة للمزيد من المعلومات حول عناصر Grid.

يظهر المثال التالي عناصر TextBox و TextBlock الخاص بالصفحة مع سمات RowProperty و ColumnProperty الخاصة بهم التي يتم تعيينها لوضع العناصر بشكل صحيح في الشبكة. اضف هذه التعليمات البرمجية إلى Page1.xaml ، أسفل عنصر Grid.

<TextBlock Grid.Column="0"
      Grid.Row="0" 
      Grid.ColumnSpan="4"
      Margin="10,5,10,0"
      HorizontalAlignment="Center"
      Style="{StaticResource titleText}">Simple WPF Control</TextBlock>

<TextBlock Grid.Column="0"
      Grid.Row="1"
      Style="{StaticResource inlineText}"
      Name="nameLabel">Name</TextBlock>
<TextBox Grid.Column="1"
      Grid.Row="1"
      Grid.ColumnSpan="3"
      Name="txtName"/>

<TextBlock Grid.Column="0"
      Grid.Row="2"
      Style="{StaticResource inlineText}"
      Name="addressLabel">Street Address</TextBlock>
<TextBox Grid.Column="1"
      Grid.Row="2"
      Grid.ColumnSpan="3"
      Name="txtAddress"/>

<TextBlock Grid.Column="0"
      Grid.Row="3"
      Style="{StaticResource inlineText}"
      Name="cityLabel">City</TextBlock>
<TextBox Grid.Column="1"
      Grid.Row="3"
      Width="100"
      Name="txtCity"/>

<TextBlock Grid.Column="2"
      Grid.Row="3"
      Style="{StaticResource inlineText}"
      Name="stateLabel">State</TextBlock>
<TextBox Grid.Column="3"
      Grid.Row="3"
      Width="50"
      Name="txtState"/>

<TextBlock Grid.Column="0"
      Grid.Row="4"
      Style="{StaticResource inlineText}"
      Name="zipLabel">Zip</TextBlock>
<TextBox Grid.Column="1"
      Grid.Row="4"
      Width="100"
      Name="txtZip"/>

تطبيق أنماط عناصر واجهة المستخدم

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

عناصر Style المضمنة في خاصية Resources للعنصر Grid، بحيث يمكن استخدامهم من قبل كافة العناصر على الصفحة. إذا تم تسمية نمط, تقوم بتطبيقه إلى عنصر عن طريق إضافة مجموعة عنصر Style إلى اسم النمط. تصبح الأنماط غير المسماة نمط افتراضي للعنصر. راجع التنسيق و القولبة للحصول على معلومات إضافية حول أنماط WPF.

يظهر المثال التالي عناصر Style لصفحة WPF. اضف التعليمات البرمجية إلى Page1.xaml ، أسفل عنصر Grid. لرؤية كيفية تطبيق الأنماط إلى العناصر، راجع مثال التعليمات البرمجية السابق. على سبيل المثال، عنصر TextBlock الأخير له نمط inlineText، عنصر TextBox 
الأخير يستخدم النمط الافتراضي.

<Grid.Resources>
  <Style x:Key="inlineText" TargetType="{x:Type TextBlock}">
    <Setter Property="Margin" Value="10,5,10,0"/>
    <Setter Property="FontWeight" Value="Normal"/>
    <Setter Property="FontSize" Value="12"/>
  </Style>
  <Style x:Key="titleText" TargetType="{x:Type TextBlock}">
    <Setter Property="DockPanel.Dock" Value="Top"/>
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="FontSize" Value="14"/>
    <Setter Property="Margin" Value="10,5,10,0"/>
  </Style>
  <Style TargetType="{x:Type Button}">
    <Setter Property="Margin" Value="10,5,10,0"/>
    <Setter Property="Width" Value="60"/>
  </Style>
  <Style TargetType="{x:Type TextBox}">
    <Setter Property="Margin" Value="10,5,10,0"/>
  </Style>
</Grid.Resources>

إضافة أزرار موافق و إلغاء الأمر

العناصر النهائية على الصفحة هي عناصر Button موافق و إلغاء الأمر الذي يشغل أول عمودين من الصف الأخير من Grid. تستخدم هذه العناصر معالج حدث شائع، ButtonClicked، نمط Button الافتراضي معرَّف في مثال التعليمات البرمجية السابقة. اضف التعليمات البرمجية التالية إلى Page1.xaml ، أسفل عنصر TextBox الأخير. جزء XAML من الصفحة الآن اكتمل.

<Button Grid.Row="5"
        Grid.Column="0"
        Name="btnOK"
        Click="ButtonClicked">OK</Button>
<Button Grid.Row="5"
        Grid.Column="1"
        Name="btnCancel"
        Click="ButtonClicked">Cancel</Button>

تنفيذ ملف التعليمات برمجية في الخلف الخاص بالصفحة

ملف لتعليمات برمجية في الخلف للصفحة WPF ، Page1.xaml.cs ، يقوم بتنفيذ المهام الأساسية الأربعة:

  1. قم بتسجيل اسم DLL للصفحة مع كائن Application بحيث يعلم من أين يتم تحميل الصفحة.

  2. يعالج الحدث الذي يحدث عند قيام المستخدم بالنقر فوق أحد الأزرار.

  3. يسترد البيانات من عناصر TextBox و يحزمها في كائن وسيطة حدث مخصص.

  4. يرفع حدث OnButtonClick المخصص الذي يقوم بإعلام المضيف أن المستخدم انتهي و يمرر البيانات إلى المضيف.

الصفحة أيضاً تكشف عن عدد من خصائص الألوان و الخطوط التي تتيح لك التحكم في مظهر الصفحة. بعكس فئة WindowsFormsHost المستخدمة لاستضافة عنصر تحكم Windows Forms، فئة ElementHost تكشف فقط خاصية Background للصفحة. للاحتفاظ بالتشابه بين هذا المثال من التعليمات البرمجية و المثال الذي تمت مناقشته في الإرشادات التفصيلية: استضافة عنصر تحكم Windows Forms في WPF، تكشف الصفحة الخصائص المتبقية مباشرة.

بنية أساسية لملف التعليمات برمجية في الخلف

يتكون ملف التعليمات برمجية في الخلف من مساحة اسم واحدة, MyControls، والذي يتضمن فئتين، Page1 و MyControlEventArgs. قم باستبدال التعليمات البرمجية في Page1.xaml.cs التالي.

using System;
using System.Windows;
using System.Windows.Navigation;
using System.Windows.Controls;
using System.Windows.Media;

namespace MyControls
{
  public partial class Page1 : Grid
  {
    //...
  }
  public class MyControlEventArgs : EventArgs
  {
    //...
  }
}

الفئة الأولى، Page1، هي فئة جزئية تحتوي على التعليمات البرمجية التي تقوم بتنفيذ الوظيفة من واجهة المستخدم المعرفة في Page1.xaml. عندما يتم تحليل Page1.xaml,يتم تحويل XAMLإلى نفس الفئة الجزئية و تدمج الفئتين الجزئيتين لتكون الصفحة المترجمة. لهذا السبب، يجب أن يطابق اسم الفئة في ملف التعليمات البرمجية الخلفية اسم الفئة المعينة إلى Page1.xaml و يجب أن ترث من العنصر الجذر للصفحة. الفئة الثانية، MyControlEventArgs, هي فئة وسائط الحدث المستخدمة في إرسال البيانات إلى المضيف.

تهيئة فئة Page1

مثال التعليمات البرمجية التالي يقوم بتنفيذ العديد من المهام الأساسية:

  • يقوم بتعريف حدث خاص OnButtonClick، و المفوض المقترن به, MyControlEventHandler.

  • يقوم بإنشاء عدة متغيرات عمومية خاصة التي تخزن بيانات المستخدم. هذه البيانات تُكشف من خلال الخصائص المطابقة.

  • يطبق معالج, Init ، لحدث Loaded الخاص بالصفحة. يقوم المعالج بتهيئة المتغيرات العمومية بواسطة تعيينهم القيم التي تم تعريفها في Page1.xaml. للقيام بذلك، يتم استخدام Name المعيَّن إلى عنصر TextBlock النموذجي, nameLabel، للوصول إلى إعدادات خاصية هذا العنصر.

قم بإضافة التعليمات البرمجية التالية إلى فئة Page1.

public partial class Page1 : Grid
{
    public delegate void MyControlEventHandler(object sender, MyControlEventArgs args);
    public event MyControlEventHandler OnButtonClick;
    private FontWeight _fontWeight;
    private double _fontSize;
    private FontFamily _fontFamily;
    private FontStyle _fontStyle;
    private SolidColorBrush _foreground;
    private SolidColorBrush _background;

    private void Init(object sender, EventArgs e)
    {
        //They all have the same style, so use nameLabel to set initial values.
        _fontWeight = nameLabel.FontWeight;
        _fontSize = nameLabel.FontSize;
        _fontFamily = nameLabel.FontFamily;
        _fontStyle = nameLabel.FontStyle;
        _foreground = (SolidColorBrush)nameLabel.Foreground;
        _background = (SolidColorBrush)rootElement.Background;
    }

معالجة أحداث نقر الأزرار

يشير المستخدم إلى انتهاء المهمة إدخال البيانات بالنقر فوق زر موافق أو زر إلغاء الأمر في أسفل الصفحة. كلاً من الأزرار يستخدم نفس معالج حدث Click، ButtonClicked. كلا من الأزرار يحتوي على اسم, btnOK أو btnFalse ، الذي يتيح للمعالج تحديد أي زر تم النقر فوقه عن طريق فحص قيمة وسيطة sender. يقوم المعالج بما يلي:

  • ينشئ كائن MyControlEventArgs الذي يحتوي على بيانات من عناصر TextBox الخاصة بالصفحة.

  • إذا قام المستخدم بالنقر فوق زر إلغاء الأمر, يتم تعيين خاصية IsOK لكائن MyControlEventArgs إلى false.

  • يرفع حدث OnButtonClick للإشارة إلى المضيف عن انتهاء المستخدم و يمرر البيانات المجمعة.

اضف التعليمات البرمجية التالية إلى فئة Page1 الخاصة بك, أدني أسلوب Init.

private void ButtonClicked(object sender, RoutedEventArgs e)
{
    MyControlEventArgs retvals = new MyControlEventArgs(true,
                                                        txtName.Text,
                                                        txtAddress.Text,
                                                        txtCity.Text,
                                                        txtState.Text,
                                                        txtZip.Text);
    if (sender == btnCancel)
    {
        retvals.IsOK = false;
    }
    if (OnButtonClick != null)
        OnButtonClick(this, retvals);
}

إنشاء الخصائص

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

قم بإضافة التعليمات البرمجية التالية إلى فئة Page1 الخاصة بك.

public FontWeight MyControl_FontWeight
{
    get { return _fontWeight; }
    set
    {
        _fontWeight = value;
        nameLabel.FontWeight = value;
        addressLabel.FontWeight = value;
        cityLabel.FontWeight = value;
        stateLabel.FontWeight = value;
        zipLabel.FontWeight = value;
    }
}
public double MyControl_FontSize
{
    get { return _fontSize; }
    set
    {
        _fontSize = value;
        nameLabel.FontSize = value;
        addressLabel.FontSize = value;
        cityLabel.FontSize = value;
        stateLabel.FontSize = value;
        zipLabel.FontSize = value;
    }
}
public FontStyle MyControl_FontStyle
{
    get { return _fontStyle; }
    set
    {
        _fontStyle = value;
        nameLabel.FontStyle = value;
        addressLabel.FontStyle = value;
        cityLabel.FontStyle = value;
        stateLabel.FontStyle = value;
        zipLabel.FontStyle = value;
    }
}
public FontFamily MyControl_FontFamily
{
    get { return _fontFamily; }
    set
    {
        _fontFamily = value;
        nameLabel.FontFamily = value;
        addressLabel.FontFamily = value;
        cityLabel.FontFamily = value;
        stateLabel.FontFamily = value;
        zipLabel.FontFamily = value;
    }
}

public SolidColorBrush MyControl_Background
{
    get { return _background; }
    set
    {
        _background = value;
        rootElement.Background = value;
    }
}
public SolidColorBrush MyControl_Foreground
{
    get { return _foreground; }
    set
    {
        _foreground = value;
        nameLabel.Foreground = value;
        addressLabel.Foreground = value;
        cityLabel.Foreground = value;
        stateLabel.Foreground = value;
        zipLabel.Foreground = value;
    }
}

إرسال البيانات إلى المضيف

المكون النهائي في الملف هو فئة MyControlEventArgs, المستخدم في إرسال البيانات التي تم تجميعها إلى المضيف. قم بإضافة التعليمات البرمجية التالية إلى مساحة الاسم MyControls الخاصة بك. التنفيذ مباشر و لن يتم مناقشته أكثر.

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

تنفيذ تطبيق مضيف نماذج Windows.

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

صفحة Windows Presentation Foundation المستضافة في تطبيق Windows Forms

عنصر تحكم Avalon لاستضافة Windows Form

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

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

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

  2. حدد مشاريع C#‎ مع قالب تطبيق نماذج Windows.

  3. قم بتسمية المشروع الجديد WFHost و وضعه في نفس مستند المستوى الأعلى الذي يحتوي على مشروع MyControls. انقر فوق موافق لإنشاء المشروع.

انك تحتاج أيضاً إلى إضافة مرجع إلى DLL التي تحتوي على صفحة WPF.

  1. انقر فوق اسم المشروع في مستكشف الحلول, و حدد إضافة مرجع.

  2. انقر فوق علامة لتبويب استعراض و انتقل إلى المجلد الذي يحتوي على MyControls.dll.

  3. حدد MyControls.dll و انقر فوق موافق لإضافة DLL إلى قائمة المراجع.

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

تنفيذ تصميم واجهة المستخدم للنموذج

افتح مصمم نماذج Windows ثم قم بتخطيط النموذج كما يظهر في الرسم التوضيحي الموضح في تنفيذ تطبيق مضيف نماذج Windows :

  1. قم بتوسيع النموذج الافتراضي للتوافق مع عناصر التحكم و صفحة WPF.

  2. قم بإضافة عنصر تحكم System.Windows.Forms.Panel إلى الزاوية العليا-اليمنى من النموذج للاحتفاظ بصفحة WPF.

  3. قم بإضافة ست مجموعات من عناصر تحكم System.Windows.Forms.RadioButton، كما هو موضح في الرسم التوضيحي.

  4. قم بإضافة خمس عناصر تحكم System.Windows.Forms.Label إلى الزاوية الأدنى-اليمني من النموذج كما هو مبين في التوضيح. عناصر التحكم هذه تعمل كأنها تسميات للبيانات التي تم إرجاعها بواسطة عنصر تحكم WPF.

  5. قم بإضافة عنصر تحكم Label إلى يمين كل عنصر تحكم Label تم إضافته في الخطوة السابقة. قم بتعيين خاصية Text من كل عنصر تحكم إلى "". تعرض عناصر التحكم هذه البيانات التي تم إرجاعها بواسطة عنصر تحكم WPF.

  6. قم بإضافة عنصر تحكم Label آخر ليخدم كعنوان لمجموعة عناصر التحكم من الخطوتين الأخيرتين. لأن هذا Label يهدف إلى أن يخدم كعنوان لمجموعة، اجعل حجم الخط أكبر نقطتين من عناصر التحكم الموجودة في المجموعة.

تهيئة النموذج

عامة تقوم بتنفيذ التعليمات البرمجية المستضيفة في معالج حدث Load الخاص بالنموذج. في "مصمم نماذج Windows" ، انقر نقراً مزدوجاً فوق النموذج لإنشاء أسلوب معالج الحدث Load. يتضمن مثال التعليمات البرمجية التالي عن معالج حدث Load الخاص بالنموذج, معالج لحدث Loaded للصفحة WPF, و تعريفات متغيرات عمومية متعددة التي يتم استخدامها فيما بعد. قم باستبدال التعليمات البرمجية في Form1.cs بالتالي.

partial class Form1 : Form
{
    private ElementHost ctrlHost;
    private MyControls.Page1 wpfAddressCtrl;
    System.Windows.FontWeight initFontWeight;
    double initFontSize;
    System.Windows.FontStyle initFontStyle;
    System.Windows.Media.SolidColorBrush initBackBrush;
    System.Windows.Media.SolidColorBrush initForeBrush;
    FontFamily initFontFamily;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        ctrlHost = new ElementHost();
        ctrlHost.Dock = DockStyle.Fill;
        panel1.Controls.Add(ctrlHost);
        wpfAddressCtrl = new MyControls.Page1();
        wpfAddressCtrl.InitializeComponent();
        ctrlHost.Child = wpfAddressCtrl;

        wpfAddressCtrl.OnButtonClick += 
            new MyControls.Page1.MyControlEventHandler(
            avAddressCtrl_OnButtonClick);
        wpfAddressCtrl.Loaded += new RoutedEventHandler(
            avAddressCtrl_Loaded);
    }

    void avAddressCtrl_Loaded(object sender, EventArgs e)
    {
        initBackBrush = (SolidColorBrush)wpfAddressCtrl.MyControl_Background;
        initForeBrush = wpfAddressCtrl.MyControl_Foreground;
        initFontFamily = wpfAddressCtrl.MyControl_FontFamily;
        initFontSize = wpfAddressCtrl.MyControl_FontSize;
        initFontWeight = wpfAddressCtrl.MyControl_FontWeight;
        initFontStyle = wpfAddressCtrl.MyControl_FontStyle;
    }

أسلوب Form1_Load في المثال التعليمات البرمجية السابق يظهر الإجراء العام لاستضافة عنصر تحكم WPF:

  1. قم بإنشاء كائن ElementHost جديد.

  2. قم بتعيين خاصية Dock التابعة لعنصر تحكم إلى DockStyle.Fill.

  3. قم بإضافة عنصر تحكم ElementHost إلى مجموعة Controls لعنصر التحكم Panel.

  4. إنشاء مثيل من صفحة WPF.

  5. استضافة الصفحة في النموذج عن طريق تعيين الصفحة إلى خاصية Child لعنصر التحكم ElementHost.

السطرين المتبقين في أسلوب Form1_Load يقوموا بإرفاق المعالجات إلى اثنين من أحداث الصفحة:

  • OnButtonClick هو حدث مخصص يتم تشغيله بواسطة الصفحة عند قيام المستخدم بالنقر فوق زر موافق أو إلغاء الأمر. انك تقوم بمعالجة الحدث للحصول على استجابة المستخدم و جمع أي بيانات قام المستخدم بملأها.

  • Loaded هو حدث قياسي يتم رفعه بواسطة صفحة WPF عندما يتم تحميلها بشكل كامل. يتم استخدام الحدث هنا لأن النموذج يحتاج إلى تهيئة عدة متغيرات عمومية باستخدام الخصائص من الصفحة. في وقت حدث Load للنموذج، الصفحة لم يتم تحميلها بشكل كامل و لا تزال تلك القيم معينة إلى null. تحتاج إلى الانتظار حتى حدوث حدث Loaded الخاص بالصفحة قبل أن يمكن الوصول إلى هذه الخصائص.

معالج حدث Loaded يظهر في مثال التعليمات البرمجية السابقة. معالج OnButtonClick يتم مناقشته في المقطع التالي.

معالجة OnButtonClick

يحدث حدث OnButtonClick عند قيام المستخدم بالنقر فوق زر موافق أو إلغاء الأمر.

يفحص معالج الأحداث حقل IsOK لوسيطة الحدث لتحديد أي زر تم النقر فوقه. تتوافق متغيرات lblبيانات إلى عناصر التحكم Label غير المرئية التي تم مناقشتها سابقًا. إذا قام المستخدم بالنقر فوق زر موافق، البيانات من عناصر تحكم TextBox الخاصة بالصفحة يتم تعيينها إلى عنصر تحكم Label المطابقة. إذا قام المستخدم بالنقر فوق إلغاء، يتم تعيين قيم Text إلى null.

قم بإضافة التعليمات البرمجية التالية إلى Form1.cs: يمكنك الآن تحوبل التطبيق برمجياً وتشغيله .

void avAddressCtrl_OnButtonClick(
    object sender, 
    MyControls.MyControlEventArgs args)
{
    if (args.IsOK)
    {
        lblAddress.Text = "Street Address: " + args.MyStreetAddress;
        lblCity.Text = "City: " + args.MyCity;
        lblName.Text = "Name: " + args.MyName;
        lblState.Text = "State: " + args.MyState;
        lblZip.Text = "Zip: " + args.MyZip;
    }
    else
    {
        lblAddress.Text = "Street Address: ";
        lblCity.Text = "City: ";
        lblName.Text = "Name: ";
        lblState.Text = "State: ";
        lblZip.Text = "Zip: ";
    }
}

تعديل مظهر صفحة Windows Presentation Foundation

عناصر تحكم RadioButton على الجانب الأيسر من النموذج يمكّن المستخدم من تغيير اللون الأمامي و لون الخلفية لصفحة WPF كعدة خصائص خط. يعرض لون الخلفية بواسطة كائن ElementHost. يتم عرض الخصائص المتبقية كخصائص مخصصة من الصفحة.

انقر نقراً مزدوجاً فوق عناصر تحكم RadioButton على النموذج لإنشاء قوالب لمعالجات الحدث CheckedChanged المطابقة. استخرج التعليمات البرمجية من المعالجات التالية و قم بإضافته إلى المعالجات المطابقة في Form1.cs.

private void radioBackgroundOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Background = initBackBrush;
}

private void radioBackgroundLightGreen_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Background = new SolidColorBrush(Colors.LightGreen);
}

private void radioBackgroundLightSalmon_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Background = new SolidColorBrush(Colors.LightSalmon);
}

private void radioForegroundOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Foreground = initForeBrush;
}

private void radioForegroundRed_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Foreground = new System.Windows.Media.SolidColorBrush(Colors.Red);
}

private void radioForegroundYellow_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Foreground = new System.Windows.Media.SolidColorBrush(Colors.Yellow);
}

private void radioFamilyOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = initFontFamily;
}

private void radioFamilyTimes_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = new FontFamily("Times New Roman");
}

private void radioFamilyWingDings_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = new FontFamily("WingDings");
}

private void radioSizeOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontSize = initFontSize;
}

private void radioSizeTen_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontSize = 10;
}

private void radioSizeTwelve_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontSize = 12;
}

private void radioStyleOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontStyle = initFontStyle;
}

private void radioStyleItalic_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontStyle = System.Windows.FontStyles.Italic;
}

private void radioWeightOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontWeight = initFontWeight;
}

private void radioWeightBold_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontWeight = FontWeights.Bold;
}

راجع أيضًا:

المهام

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

المرجع

ElementHost

WindowsFormsHost

المبادئ

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

موارد أخرى

مصمم WPF