مشاركة عبر


نظرة عامة حول الخصائص المرفقة

الخاصية المرفقة هو مفهوم معرّف من قِبل Extensible Application Markup Language (XAML). الخاصية المرفقة تهدف إلى أن يتم استخدامها كنوع خاصية عمومية قابلة للتعيين على أي كائن. في Windows Presentation Foundation (WPF) ، عادةً ما يتم تعريف الخصائص المرفقة كنموذج متخصص من خاصية التبعية التي تحتوي على خاصية اصطلاح "المجمّع".

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

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

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

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

سبب استخدام الخصائص المرفقة

غرض الخاصية المرفقة هو السماح للعناصر التابعة المختلفة بتحديد قيم فريدة للخاصية التي يتم تعريفها بالفعل من قبل عنصر أصل. يحتوي تطبيق معين من هذا السيناريو على العناصر التابعة تعلم العنصر الأصل كيفية تقديمها في واجهة المستخدم (UI). هو مثال خاصية DockPanel.Dock . خاصية DockPanel.Dock التي تم إنشاءها كــ خاصية مرفقة لأنه تم تصميمها لتعيينها على العناصر الموجودة ضمن DockPanel ، وليس على DockPanel نفسه. تقوم فئة DockPanel بتعريف حقل DependencyProperty الثابت باسم DockProperty ، ثم يوفر أساليب GetDock و SetDock كـ accessors عمومية لـ الخاصية المرفقة .

الخصائص المرفقة في XAML

في XAML ،تقوم بتعيين الخصائص المرفقة باستخدام بناء الجملة AttachedPropertyProvider. PropertyName 

التالي هو مثال عن كيفية تعيين DockPanel.Dock في XAML:

<DockPanel>
  <CheckBox DockPanel.Dock="Top">Hello</CheckBox>
</DockPanel>

لاحظ أن الاستخدام يشبه إلى حد ما الخاصية الثابتة; دائماً تقوم بالرجوع إلى نوع DockPanel الذي يملك و يسجل الخاصية المرفقة بدلاً من الإشارة إلى أي مثيل المحدد حسب الاسم.

أيضاً لأن الخاصية المرفقة في XAML هي إحدى السمات التي تقوم بتعيينها في العلامات ، فقط على أي عملية تعيين لها صلة. لا تحصل مباشرةً على خاصية في XAML ، بالرغم من وجود بعض الآليات الغير مباشرة لمقارنة قيم مثل المشغلات في الأنماط (للحصول على تفاصيل، راجع التنسيق و القولبة).

تطبيق الخاصية المرفقة في WPF

في Windows Presentation Foundation (WPF) ، معظم الخصائص المرفقة التي توجد على أنواع WPF يتم تطبيقها كــ خصائص التبعية . إن الخصائص المرفقة هي مفهوم XAML ، بينما خصائص التبعية هي مفهوم WPF . لأن الخصائص المرفقة WPF هي خصائص تبعية ، أنها تدعم مفاهيم خاصية التبعية مثل بيانات تعريف الخاصية و القيم الافتراضية من بيانات تعريف الخاصية.

كيفية استخدام الخصائص المرفقة بواسطة نوع المالك

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

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

  • سيتم استخدام النوع الذي سيقوم بتعريف الخاصية المرفقة كعنصر تابع للعديد من عناصر الأصل المحتملة و طرازات المحتوى.

  • النوع الذي يقوم بتعريف الخاصية المرفقة يمثل خدمة. أنواع أخرى تقوم بتعيين قيم الخاصية المرفقة . ثم عند تقييم العنصر الذي يقوم بتعيين الخاصية في سياق الخدمة المرفقة ، فإن قيم الخاصية المرفقة يتم الحصول عليها قيم خلال منطق داخلي لفئة الخدمة.

مثال عن خاصية مرفقة معرفة كأصل

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

DockPanel يعرّف الخاصية المرفقة DockPanel.Dock ، وDockPanel يحتوي على تعليمات برمجية من مستوى الفئة كجزء من منطق التقديم الخاص بها (بالذات، MeasureOverride و ArrangeOverride). المثيل DockPanel سيقوم دائماً بالتحقق ما إذا كان أي من العناصر التابعة الفورية الخاص بها قد قامت بتعيين قيمة لـ DockPanel.Dock. إذا حدث، تلك القيم تصبح الإدخال لـمنطق التقديم المطبق للعنصر التابع المعين . مثيلات DockPanel المتداخلة كل منها تقوم بمعاملة مجموعات العناصر التابعة الفورية الخاصة بهم ولكن السلوك هو تطبيق محدد إلى كيفية DockPanel يقوم بمعالجة قيم DockPanel.Dock . نظرياً يمكن أن نحظى بخصائص مرفقة التي تؤثر على عناصر خارج الأصل الفوري. إذا كانت الخاصية المرفقة DockPanel.Dock يتم تعيينها على عنصر الذي لا يملك عنصر أصل DockPanel للعمل به ، لن يوجد خطأ أو استثناء. وهذا ببساطة يعني أن قيمة الخاصية العمومية قد تم تعيينها قيمة ولكنها لا تحتوي على أي أصل DockPanel حالي الذي قد يستهلك المعلومات.

الخصائص المرفقة في التعليمات البرمجية

الخصائص المرفقة في WPF لا تحتوي على أساليب "المجمع" CLR النموذجية لسهولة الحصول على/تعيين الوصول. ويرجع ذلك إلى إن الخاصية المرفقة ليست بالضرورة أن تكون جزءاً من مساحة الاسم CLR للمثيلات حيث يتم تعيين الخاصية . ومع ذلك، قاريء XAML يجب أن يتمكن من تعيين تلك القيم عند معالجة الــ XAML . كي تكون خاصية مرفقة فعالة ،يجب على نوع المالك للـ الخاصية المرفقة تنفيذ أساليب استرجاع القيمة المخصصة في النموذج Get PropertyName وSet PropertyName . هذه الأساليب لاسترجاع القيمة المخصصة مفيدة أيضاً لقراءة أو تعيين الخاصية المرفقة في التعليمات البرمجية. من منظور التعليمات البرمجية ، تتشابه الخاصية المرفقة مع حقل النسخ له أسلوب استرجاع القيمة بدلاً من خاصية إرجاع القيمة ثم حقل النسخ يمكن وجوده على أي كائن بدلاً من الحاجة إلى تعريفه بشكل خاص.

يظهر المثال التالي كيفية يمكنك تعيين الخاصية المرفقة في التعليمات البرمجية. في المثال، يعتبر myCheckBox مثيل لفئة CheckBox.

      Dim myDockPanel As New DockPanel()
      Dim myCheckBox As New CheckBox()
      myCheckBox.Content = "Hello"
      myDockPanel.Children.Add(myCheckBox)
      DockPanel.SetDock(myCheckBox, Dock.Top)
DockPanel myDockPanel = new DockPanel();
CheckBox myCheckBox = new CheckBox();
myCheckBox.Content = "Hello";
myDockPanel.Children.Add(myCheckBox);
DockPanel.SetDock(myCheckBox, Dock.Top);

تمثلاً بحالة XAML ، إذا لم تكن قد تمت إضافة myCheckBox كعنصر تابع من myDockPanel عند السطر الثالث من التعليمات البرمجية ، السطر الرابع من التعليمات البرمجية قد لا يقوم بإصدار استثناء ولكن قيمة الخاصية لن تقوم بالتفاعل مع أصل DockPanel و بالتالي لن تقوم بأي شيء . فقط قيمة DockPanel.Dock المعينة على عنصر تابع المضمومة مع وجود عنصر أصل DockPanel ستؤدي إلى سلوك فعال في التطبيق المقدم. (في هذه الحالة، يمكنك تعيين الخاصية المرفقة, ثم إرفاقها إلى الشجرة. أو قد تقوم بالإرفاق إلى الشجرة ثم تعيين الخاصية المرفقة. كلا الترتيبان للإجراء يقومان بتوفير نفس النتيجة.)

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

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

إذا كنت تريد تمكين توريث قيمة الخاصية على خاصية ، يجب عليك استخدام الخصائص المرفقة بدلاً من الخصائص التبعية غير المرفقة. للمزيد من التفاصيل ، راجع وراثة قيمة الخاصية.

الخصائص المرفقة المخصصة

متى يتم إنشاء الخاصية المرفقة ؟

قد تقوم بإنشاء الخاصية المرفقة عند وجود السبب لجعل آلية إعداد الخاصية متوفرة لفئات أخرى غير فئة التعريف. السيناريو الأكثر شيوعاً لهذا المخطط. أمثلة لخصائص التخطيط الموجودة هي DockPanel.Dock ، Panel.ZIndex ، و Canvas.Top. السيناريو المتوفر هنا أنه أن العناصر الموجودة كـ العناصر التابعة لعناصر التحكم في التخطيط قادرة على التعبير عن متطلبات التخطيط إلى عناصر أصل التخطيط الخاصة بهم بشكل منفرد، كلٍ يقوم بإعداد لقيمة خاصية الذي يقوم الأصل بتعريفها كــ الخاصية المرفقة .

سيناريو آخر لاستخدام الخاصية المرفقة هو عندما تمثل الفئة الخاصة بك خدمة و أن تريد الفئات حتى تتمكن من تكامل الخدمة بشكل أكثر شفافية.

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

كما ذكر من قبل ، يجب أن تقوم بالتسجيل كخاصية مرفقة إذا كنت تريد استخدام توريث قيمة الخاصية .

كيفية إنشاء خاصية مرفقة

إذا قامت الفئة الخاصة بك بتعريف خاصية مرفقة حصراً للاستخدام على أنواع أخرى فالفئة لا يلزم أن تنحدر من DependencyObject. لكنك تحتاج إلى أن تنحدر من DependencyObject إذا اتبعت في الطراز WPF الاجمالي لجعل الخاصية المرفقة الخاصة بك أيضاً أن تكون خاصية تبعية.

قم بتعريف الخاصية المرفقة الخاصة بك كـخاصية التبعية بواسطة تعريف حقل public static readonly من النوع DependencyProperty.. تقوم بتعريف هذا الحقل باستخدام قيمة الإرجاع من أسلوب RegisterAttached . يجب أن يطابق اسم الحقل اسم الخاصية المرفقة ، ملحقة مع سلسلة Property ، لاتباع في نقش WPF المؤسس لتسمية حقول التعريف مقابل الخصائص التي تمثلها . موفر الخاصية المرفقة يجب أن يوفر أساليب Get PropertyName و Set PropertyName ثابتة كـ accessors للخاصية المرفقة; الفشل في القيام بذلك ينتج نظام الخاصية الغير قادر على استخدام الخاصية المرفقة الخاصة بك .

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

إذا قمت بحذف خاصية المرفق تشغيل أسلوب استرجاع قيمة بيانات ربط تشغيل إلى الخاصية لا تعمل في أدوات التصميم، مثل Visual Studioدمج التعبير.

أسلوب استرجاع القيمة Get

يجب أن يكون توقيع accessor PropertyName Get:

public static object Getاسم الخاصية(object target)

  • الكائن target يمكن تعيينه على أنه نوع محدد في التطبيق الخاص بك . على سبيل المثال، اسلوب DockPanel.GetDock يقوم بكتابة المعلم كـ UIElement ، لأن الخاصية المرفقة فقط المقصود بها هو التعيين على مثيلات UIElement .

  • قيمة العائد يمكن تعيينها كنوع أكثر دقة في التطبيق الخاص بك. على سبيل المثال، إن أسلوب GetDock يقوم بكتابتها كـ Dock ، لأنه يمكن تعيين القيمة لهذا التعداد.

أسلوب استرجاع قيمة للمجموعة

يجب أن يكون توقيع accessor PropertyName Set:

public static void Setاسم الخاصية(object target, object value)

  • الكائن target يمكن تعيينه على أنه نوع محدد في التطبيق الخاص بك . على سبيل المثال، اسلوب SetDock يقوم بكتابته كـ UIElement ، لأن الخاصية المرفقة فقط المقصود بها هو التعيين على مثيلات UIElement .

  • الكائن value يمكن تعيينه على أنه نوع محدد في التطبيق الخاص بك . على سبيل المثال، إن أسلوب SetDock يقوم بكتابتها كـ Dock ، لأنه يمكن تعيين القيمة لهذا التعداد. تذكر أن قيمة هذا الأسلوب هو الإدخال من محمل XAML عندما يواجه الخاصية المرفقة الخاصة بك في استخدام الخاصية المرفقة في العلامات. يكون هذا الإدخال القيمة المحددة كقيمة السمة XAML في العلامات. ولذلك يجب أن يكون نوع التحويل أو مُسلسل القيمة أو ملحق العلامات للنوع الذي تقوم باستخدامه ، بحيث يمكن إنشاء النوع المناسب من قيمة السمة (وهو النهاية سلسلة فقط).

المثال التالي يقوم بعرض تسجيل خاصية التبعية (باستخدام أسلوب RegisterAttached ) ، بالإضافة إلى Get PropertyName و accessors PropertyName Set. في المثال ، اسم الخاصية المرفقة هو IsBubbleSource. ولذلك، accessors يجب تسميته كــ GetIsBubbleSource و SetIsBubbleSource.

Public Shared ReadOnly IsBubbleSourceProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsBubbleSource", GetType(Boolean), GetType(AquariumObject), New FrameworkPropertyMetadata(False, FrameworkPropertyMetadataOptions.AffectsRender))
Public Shared Sub SetIsBubbleSource(ByVal element As UIElement, ByVal value As Boolean)
    element.SetValue(IsBubbleSourceProperty, value)
End Sub
Public Shared Function GetIsBubbleSource(ByVal element As UIElement) As Boolean
    Return CType(element.GetValue(IsBubbleSourceProperty), Boolean)
End Function
public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached(
  "IsBubbleSource",
  typeof(Boolean),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)
);
public static void SetIsBubbleSource(UIElement element, Boolean value)
{
  element.SetValue(IsBubbleSourceProperty, value);
}
public static Boolean GetIsBubbleSource(UIElement element)
{
  return (Boolean)element.GetValue(IsBubbleSourceProperty);
}

سمات الخاصية المرفقة

WPF يعرّف العديد من سمات NET Framewor. التي تم تخصيصها لتوفير معلومات حول الخصائص المرفقة لعمليات الانعكاس و للمستخدمين النموذجيين لمعلومات الانعكاس و الخاصية مثل المصممين. لأن الخصائص المرفقة تحتوي على نوع من نطاق غير محدود ، يحتاج المصممون إلى طريقة لتجنب المستخدمين المزعجين بقائمة عمومية بكافة الخصائص المرفقة التي تم تعريفها في تطبيق تقنية معينة يستخدم XAML. سمات NET Framewor. الذي يقوم بتعريفه WPF للخصائص المرفقة يمكن استخدامه للوضع في النطاق الحالات حيث الخاصية المرفقة المعطاة ينبغي إظهارها في إطار الخصائص. عليك تطبيق تلك السمات للخصائص المرفقة المخصصة الخاصة بك أيضاً. الغرض وبناء الجملة لــ سمات NET Framewor. يتم وصفه في صفحات المرجع المناسب:

تعلم المزيد حول الخصائص المرفقة

  • للحصول على مزيد من المعلومات حول إنشاء خاصية مرفقة ، راجع كيفية القيام بما يلي: تسجيل الخاصية المرفقة.

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

  • يمكنك تسجيل خاصية أيضاً مثل خاصية مرفقة ، و كـخاصية تبعية ، ولكن بعدها لا يزال يقوم بالكشف عن تطبيقات "المجمّع". في هذه الحالة، يمكن تعيين الخاصية إما على هذا العنصر أو على أي عنصر خلال بناء جملة XAML الخاصية المرفقة مثال على خاصية بسيناريو مناسب لـكلا من الاستخدامات القياسية و المرفقة FrameworkElement.FlowDirection.

راجع أيضًا:

المهام

كيفية القيام بما يلي: تسجيل الخاصية المرفقة

المرجع

DependencyProperty

المبادئ

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

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

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