مشاركة عبر


نظرة عامة حول خصائص التبعية

Windows Presentation Foundation (WPF) توفر مجموعة من الخدمات التي يمكن استخدامها لتوسيع وظائف خاصيةوقت تشغيل اللغة العامة (CLR) . ككل ، هذه الخدمات تتم عادة الإشارة إليها بنظام الخاصيةWPF . الخاصية التي يتم نسخها بواسطة نظام الخاصية WPF تعرف كخاصية التبعية
 .
 توضح هذه النظرة العامة نظام الخاصية WPF و القدرات الخاصة بخاصية التبعية 
 . هذا يتضمن كيفية استخدام خصائص التبعية
 الموجودة في Extensible Application Markup Language (XAML)و في التعليمات البرمجية. هذه النظرة العامة ايضا تقدم أوجه خصائص تبعية متخصصة,مثل خاصية تبعية بيانات التعريف وكيفية إنشاء خاصية التبعية الخاصة بك في فئة مخصصة.

يشتمل هذا الموضوع على الأقسام التالية.

  • المتطلبات الأساسية
  • خصائص التبعية و خصائص CLR
  • خصائص التبعية و خصائص CLR
  • تعيين قيم الخاصية
  • توظيف خاصية يوفَر بواسطة خاصية تبعية
  • أسبقية قيمة خاصية التبعية
  • تعلم المزيد حول خصائص التبعية
  • موضوعات ذات صلة

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

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

خصائص التبعية و خصائص CLR

في WPF ، الخصائص عادةً تعرض كـخصائص وقت تشغيل اللغة العامة (CLR) . في مستوى اساسي, يمكنك التفاعل مع هذه الخصائص مباشرة "و" عدم التعرف ابدا علي أنها نفذت كخاصية التبعية 
 . ومع ذلك، يجب أن تصبح متالف مع بعض أو كافة الميزات الخاصة بنظام الخاصية WPF بحيث يمكنك الاستفادة من هذه الميزات.

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

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

خصائص التبعية و خصائص CLR

خصائص التبعية و نظام الخاصية WPF توسع الأداء الوظيفي للخاصية عن طريق توفير نوع للنسخ على خاصية ,باسم تطبيق بديل لنمط قياسي لنسخ الخاصية بحقل خاص. ااسم جهة هذا النوع هو DependencyProperty. الانوع الهامة الأخرى التي تعرف نظام الخاصية WPF هي
 DependencyObject. 
يعريفDependencyObject الفئة الأساسية التي يمكنها التسجيل ثم تملك خاصية التبعية . 

يكون التالي هو جمع للمصطلحات المستخدمة في هذه الوثائق عدة تطوير البرامج (SDK) عند مناقشة خاصية التبعية :

  • **خاصية التبعية:**خاصية يتم نسخها بواسطة DependencyProperty.

  • معرف خاصية التبعية:علي سبيل المثال DependencyProperty , الذي يتم الحصول عليها كقيمة إرجاع عند تسجيل خاصية التبعية ، ثم تخزن كعضو من فئة. يتم استخدام هذا المعرف كمعلمة في العديد من واجهات API التي تتفاعل مع نظام الخاصية WPF .

  • برنامج تضمين CLR الحصول علي و ضبط التطبيقات الفعلي للخاصية. هذه التطبيقات تدمج معرف خاصية التبعية بواسطة استخدامها في GetValue و ندهات
 SetValue وبالتالي توفير النسخ الخاصة بالخاصية باستخدام نظام الخاصية WPF.

يحدد المثال التالي IsSpinning خاصية التبعية 
 ، و يوضح العلاقة الخاصة بالمعرف DependencyProperty إلى الخاصية التي ينسخها.

Public Shared ReadOnly IsSpinningProperty As DependencyProperty =
    DependencyProperty.Register("IsSpinning",
                                GetType(Boolean),
                                GetType(MyCode))

Public Property IsSpinning() As Boolean
    Get
        Return CBool(GetValue(IsSpinningProperty))
    End Get
    Set(ByVal value As Boolean)
        SetValue(IsSpinningProperty, value)
    End Set
End Property
public static readonly DependencyProperty IsSpinningProperty = 
    DependencyProperty.Register(
    "IsSpinning", typeof(Boolean),


...


    );
public bool IsSpinning
{
    get { return (bool)GetValue(IsSpinningProperty); }
    set { SetValue(IsSpinningProperty, value); }
}

اصطلاح التسمية للخاصية و مجال دعمها DependencyProperty هو هام. اسم الحقل دوماً هو اسم الخاصية، بإلحاق الاحقة Property . لمزيد من المعلومات حول هذا الاصطلاح و الاسباب , راجع خصائص التبعية المخصصة.

تعيين قيم الخاصية

يمكنك تعيين خصائص إما في التعليمات البرمجية أو في XAML.

تعيين قيم الخاصية في XAML

المثال التالي XAML يحدد لون خلفية الزر كـاحمر. يوضح هذا المثال حالة حيث قيمة السلسلة البسيطة لسمةXAML يتم تحويل نوعها بواسطة المحمل XAML في نوع WPF 
(Color ، بطريقة SolidColorBrush) في التعليمات البرمجية المنشأة.

<Button Background="Red" Content="Button!"/>

XAML يدعم العديد من نماذج بناء الجملة لاعداد الخصائص. بناء الجملة التي يتم استخدامها لخاصية معينة تعتمد على قيمة النوع التي تستخدمها الخاصية بالإضافة إلى العوامل الأخرى مثل وجود نوع محول . للحصول على مزيد من المعلومات حول بناء الجملةXAML لإعداد الخاصية راجع نظرة عامة على XAML (WPF) و بناء جملة XAML بالتفاصيل.

كمثال لبناء جملة ليست سمة , المثال التالي XAML يظهر زر خلفية آخر. هذا الوقت بدلاً من تعيين لون خالص بسيط, يتم تعيين الخلفية لصورة باستخدام عنصر يمثل هذه الصورة و مصدر هذه الصورة المحددة كسمة العنصر المتداخل. هذا مثال عنصر خاصية بناء الجملة .

<Button Content="Button!">
  <Button.Background>
    <ImageBrush ImageSource="wavy.jpg"/>
  </Button.Background>
</Button>

إعداد خصائص في رمز

إعداد قيم خاصية التبعية في التعليمات البرمجية عادة هو فقط ندهة لمجموعة تطبيق بواسطة "المجمّع" CLR.

        Dim myButton As New Button()
        myButton.Width = 200.0
Button myButton = new Button();
myButton.Width = 200.0;

الحصول على قيمة الخاصية أيضاً يستدعي ندهة الحصول على تطبيق "المجمّع" المحصول عليه بشكل أساسي:

        Dim whatWidth As Double
        whatWidth = myButton.Width
double whatWidth;
whatWidth = myButton.Width;

يمكنك أيضاً استدعاء خاصية النظام واجهات API GetValue و SetValue مباشرة. هذا غير ضرورية عادة في حالة استخدام الخصائص الموجودة (wrappers تكون أكثر ملائمة وتوفر التعرض أفضل من الخاصية للحصول على معلومات حول أدوات المطور) ، ولكن استدعاء واجهات API مباشرة هو مناسب لسيناريوهات معينة.

يمكن أيضاً تعيين الخصائص في XAML ثم توصَل فيما بعد في تعليمات برمجية ،خلال تعليمات برمجية خلفية. للمزيد من التفاصيل ، راجع تعليمات برمجية-الخلف و XAML في WPF.

توظيف خاصية يوفَر بواسطة خاصية تبعية

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

  • موارد

  • ربط البيانات.

  • الأنماط

  • رسم متحرك

  • تجاوزات بيانات التعريف

  • وراثة قيمة الخاصية

  • تكامل مصمم WPF

موارد

يمكن تعيين قيمة خاصية تبعية عن طريق الإشارة إلى أحد الموارد. يتم عادةً تحديد الموارد كعناصر تابعة للعنصر الجذر أو للتطبيق (هذه المواقع تمكن الوصول الأكثر ملاءمةً للمورد). يظهر المثال التالي كيف يتم تعريف الموردSolidColorBrush.

<DockPanel.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</DockPanel.Resources>

بمجرد أن يتم تعريف المورد, يمكنك الاشارة للمورد ثم استخدمه لتوفير قيمة الخاصية:

<Button Background="{DynamicResource MyBrush}" Content="I am gold" />

تتم الإشارة إلى هذا المورد المعين كملحق علامات DynamicResource (في XAML ، يمكنك استخدام إما مرجع مورد ثابت أو حيوي). لاستخدام مرجع مورد حيوي, يجب أن يكون معد إلى خاصية تبعية، بحيث يكون استخدام مرجع المورد الحيوي الذي يتم تمكينه بواسطة نظام الخاصيةWPF . لمزيد من المعلومات، راجع نظرة عامة حول الموارد.

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

معاملة الموارد كقيمة محلية, وهذا يعني أنه إذا قمت بتعيين قيمة محلية أخرى سوف تتخلص من مرجع المورد .للمزيد من التفاصيل ، راجع أسبقية قيمة خاصية التبعية.

ربط البيانات.

يمكن لخاصية التبعية الاشارة لقيمة خلال ربط.البيانات ربط البيانات يعمل من خلال علامات بناء جملة محدد ملحق فيXAML, أو
 Binding الكائن في التعليمات البرمجية. مع ربط البيانات، يؤجل تحديد قيمة الخاصية النهائي حتى وقت التشغيل,في أي وقت يتم الحصول علي القيمة من مصدر بيانات.

يقوم المثال التالي بإعداد خاصيةContent للحصول علي Button XAMLباستخدام ربط ما فيا . يستخدم الربط سياق بيانات موروثة و مصدر بيانات XmlDataProvider (غير معروضة). الربظ نفسه يحدد مصدر الخاصية المرجو بواسطة XPath داخل مصدر البيانات.

<Button Content="{Binding XPath=Team/@TeamName}"/>
ملاحظةملاحظة

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

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

الأنماط

الانماط والقوالب هما اثنين من سيناريوهات تحفيز الchief لاستخدام خواص التبعية. الانماط مفيدة بشكل خاص في إعداد الخصائص التي تعرف التطبيق واجهة المستخدم (UI). يتم عادة تعريف الانماط كموارد في XAML. تتفاعل الأنماط مع نظام الخاصية لأنها تحتوي على "setters" لخصائص معينة بشكل عام, بالإضافة إلى "المشغلات" التي تغيير قيمة خاصية استناداً إلى قيمة خاصية أخرى في وقت التشغيل.

المثال التالي ينشيء نمط بسيط جداً (الذي قد يتم تعريفه داخل قاموسResources , غير معروضة) ، ثم تطبيق ذلك النمط مباشرة إلى خاصية Style للحصول على Button. يعيين الsetter ضمن النمط خاصيةBackground للحصول علي Buttonمنمط إلى اللون الأخضر.

<Style x:Key="GreenButtonStyle">
  <Setter Property="Control.Background" Value="Green"/>
</Style>
<Button Style="{StaticResource GreenButtonStyle}">I am green!</Button>

لمزيد من المعلومات، راجع التنسيق و القولبة.

رسم متحرك

خواص التبعية يمكن ان تحرك. عندما يتم تطبيق وتشغيل الحركة, تعمل القيمة المتحركة في أسبقية من أي قيمة (مثل قيمة محلية) تملكها .

المثال التالي يحرك ال Background على الخاصية Button (من الناحية التقنية، الرمز Background يتحرك باستخدام خاصية بناء الجملة الي مكان فارغ معين SolidColorBrush كما 
Background ، ثم خاصية 
 Color التي ل SolidColorBrush هي الخاصيةالتي اصبحت متحركة مباشرة).

<Button>I am animated
  <Button.Background>
    <SolidColorBrush x:Name="AnimBrush"/>
  </Button.Background>
  <Button.Triggers>
    <EventTrigger RoutedEvent="Button.Loaded">
      <BeginStoryboard>
        <Storyboard>
          <ColorAnimation
            Storyboard.TargetName="AnimBrush" 
            Storyboard.TargetProperty="(SolidColorBrush.Color)"
            From="Red" To="Green" Duration="0:0:5" 
            AutoReverse="True" RepeatBehavior="Forever" />
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Button.Triggers>
</Button>

للحصول على مزيد من المعلومات حول تحريك الخصائص ، راجع نظرة عامة حول الحركة و نظرة عامة حول لوحات العمل.

تجاوزات بيانات التعريف

يمكنك تغيير سلوك معين لخاصية تبعية بواسطة تجاوز بيانات التعريف لتلك الخاصية عندما تشتق من الفئة التي تسجل في الاصل خاصية التبعية . تجاوز بيانات التعريف يعتمد علي المعرف DependencyProperty . تجاوز بيانات التعريف لا يتطلب خاصية اعادة البناء . تتم معالجة بيانات التعريف أصلاً عن طريق تغيير نظام الخاصية; كل فئة تحمل بيانات تعريف فردية لكافة الخصائص الموروثة من فئات أساسية ,على أساس لكل نوع.

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

  Public Class SpinnerControl
      Inherits ItemsControl
      Shared Sub New()
          DefaultStyleKeyProperty.OverrideMetadata(GetType(SpinnerControl), New FrameworkPropertyMetadata(GetType(SpinnerControl)))
      End Sub
  End Class
public class SpinnerControl : ItemsControl
{
    static SpinnerControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(SpinnerControl), 
            new FrameworkPropertyMetadata(typeof(SpinnerControl))
        );
    }
}

للحصول على مزيد من المعلومات حول تجاوز أو الحصول على تعريف بيانات الخاصية، راجع الخاصية التبعية بيانات التعريف.

وراثة قيمة الخاصية

أن يرث عنصر قيمة خاصية التبعية من الأصل في شجرة .

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

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

يظهر المثال التالي رابطة, ويعيين الخاصية DataContextالتي تحدد مصدر الربط الغير مبيَن في المثال السابق للربط . أي روابط لاحقة في الكائنات التابعة لا تحتاج إلى تحديد المصدر, يمكنهم استخدام القيمة المورثة من DataContext في الكائن الأصل StackPanel . (بدلاً من ذلك، يمكن للكائن تابع الاختيار لتحديد DataContext الخاصة به أو مباشرة Source في Binding ،و عن عمد لا يستخدام القيمة الموروثة لسياق بيانات الروابط الخاصة به.)

<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource XmlTeamsSource}}">
  <Button Content="{Binding XPath=Team/@TeamName}"/>
</StackPanel>

لمزيد من المعلومات، راجع وراثة قيمة الخاصية.

تكامل مصمم WPF

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

أسبقية قيمة خاصية التبعية

عند الحصول على قيمة خاصية التبعية , انت من المحتمل تحصل علي القيمة التي تم تعيينها للخاصية عبراي من إدخالات خصائص-المستند الاخري التي تشارك في نظام الخاصيةWPF. أسبقية قيمة خاصية التبعية موجودة بحيث مختلف السيناريوهات لكيفية الحصول على قيمتها يمكن لها التفاعل بطريقة متوقعة.

خذ بعين الاعتبار المثال التالي: يتضمن المثال النمط الذي ينطبق على كافة الأزرار وال خصائص الخاصة بهم Background، ولكن يحدد زر واحد أيضاً تعيين قيمة محلياً Background .

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

تستخدم وثائق SDK شروط "القيمةالمحلية'' أو" تعيين القيمة محلياً" أحياناً عند مناقشة خصائص التبعية.تعيين القيمة محلياً هو خاصية القيمة التي تم تعيينها مباشرة على كائن مثيل في التعليمات البرمجية أو كسمة على عنصر في XAML.

بشكل فعال,للزر الأول , تتعيين الخاصية مرتين، ولكن يتم تطبيق قيمة واحدة فقط: القيمة ذات الأسبقية الاعلي. تعيين القيمة محلياً لها الأسبقية (عدا في حالة تشغيل الحركة, لكن في هذا المثال لا يوجد حركة) وبالتالي يتم استخدام تعيين القيمة محلياً بدلاً من نمط setter القيمة للخلفية على الزر الأول. لا يحتوي الزر الثاني علي قيمة محلية (و عدم وجود قيمة لها الأسبقية في نمط setter) و وبذلك تأتي الخلفية في ذلك الزر من نمط setter .

<StackPanel>
  <StackPanel.Resources>
    <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
     <Setter Property="Background" Value="Red"/>
    </Style>
  </StackPanel.Resources>
  <Button Background="Green">I am NOT red!</Button>
  <Button>I am styled red</Button>
</StackPanel>

لماذا أسبقية خاصية التابعية موجودة؟

عادةً، قد لا تريد الأنماط دوماً تطبَق و تخفي حتى تعيين قيمة عنصر فردي محلياً(وإلا، سيكون صعب جداً استخدام أنماط أو العناصر بشكل عام). ولذلك، تعمل القيم التي تأتي من الأنماط في بوجود أقل من تعيين القيمة محلياً. للحصول على قائمة اشمل من خصائص التبعية وأين القيمة الفعالة لخاصية التبعية قد تأتي من, راجع أسبقية قيمة خاصية التبعية.

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

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

تعلم المزيد حول خصائص التبعية

  • الخاصية المرفقة هي نوع خاصية تدعم بناء جملة متخصصة في XAML. الخاصية المرفقة غالباً لم يكن لها المراسلات 1: 1 مع الخاصيةوقت تشغيل اللغة العامة (CLR)، وهو ليس بالضرورة خاصية التبعية . الغرض النموذجي للخاصية المرفقةهو السماح للعناصر التابعة تقرير قيم الخاصية للعنصرالأصل إذا كان العنصر الأصل والعنصر التابع ليس كلاهما يمتلك هذي الخاصية كجزء من قوائم أعضاء الفئة. سيناريو أساسي واحد هو تمكين العناصر التابعة من إعلام الأصل كيفية التقديم في واجهة المستخدم ؛ على سبيل المثال، راجع Dock أو Left. للمزيد من التفاصيل ، راجع نظرة عامة حول الخصائص المرفقة.

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

  • خصائص التبعية بشكل عام يجب اعتبارها خصائص العمومية ، يمكن الوصول إليها أو الأقل قابلة للاكتشاف من قبل أي متصل لديه حق الوصول لمثيل. للمزيد من التفاصيل ، راجع حماية الخاصية التبعية.

راجع أيضًا:

المبادئ

خصائص التبعية المخصصة

خصائص للقراءة فقط التبعية

نظرة عامة على XAML (WPF)

بنية WPF