الأشجار فى الWPF

في العديد من التقنيات، العناصر والمكونات منظمة في بنية شجرة حيث يمكن للمطورين معالجة عناصر الكائن في الشجرة لتؤثر على التقديم أو سلوك التطبيق. Windows Presentation Foundation (WPF) يستخدم أيضاً عدة من الاستعارات لبنية الشجرة لتعريف العلاقات بين عناصر البرنامج. بالنسبة للجزء الأكبر WPF يمكن للمطورين إنشاء تطبيق في التعليمات البرمجية أو تعريف أجزاء من التطبيق في XAML أثناء التفكير في مفهوم أستعارة كائن الشجرة ،ولكن سيتم استدعاء API محددة أو باستخدام العلامات المحددة للقيام بذلك بدلاً من بعض معالجة شجرة الكائن API العامة مثل قد تستخدم في XML DOM. WPF كشف فئتين لالمساعدة التي توفر طريقة عرض استعارة شجرة ، LogicalTreeHelper و VisualTreeHelper. يتم استخدام المصطلحات الشجرة المرئية و الشجرة المنطقية أيضاً في وثائق الWPF لأن هذا الشجر نفسه يفيد لفهم سلوك معين لمفتاح ميزات الWPF . هذا الموضوع يقوم بتعريف ما يمثلانه الشجرة المرئية و الشجرة المنطقية ،تتناول هذه المقالة كيفية ربط الأشجار بمفهوم كائن الشجرة الكلي، و يقدم LogicalTreeHelper و VisualTreeHelper s

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

  • الأشجار فى الWPF
  • الشجرة المنطقية
  • الشجرة المرئية
  • الأشجار،محتويات العناصر و محتويات مضيفين
  • شجرة اجتياز
  • توجيهات من أجل الأحداث الموجه مثل "شجرة"
  • قواميس الموارد و الأشجار
  • موضوعات ذات صلة

الأشجار فى الWPF

بنية الشجرة الأكثر كمال في WPF هي شجرة الكائن. إذا عرّفت صفحة تطبيق في XAML ثم قم بتحميل XAML ، يتم إنشاء بنية الشجرة استناداً إلى العلاقات المتداخلة لالعناصر في العلامات. إذا قمت بتعريف تطبيق ما أو جزء من التطبيق في التعليمات البرمجية ثم يتم إنشاء بنية شجرة استناداً إلى كيفية تعيين قيم الخصائص التي تقوم بتطبيق نموذج المحتوى لكائن مُعطى. في Windows Presentation Foundation (WPF)، توجد طريقتان لتصور شجرة الكائن الكاملة و يمكن أن يتم تسجيلها في API العام الخاص بها : كما في الشجرة المنطقية و كما في الشجرة المرئية. التمييز بين شجرة المنطقيةو شجرة المرئية ليست بالضرورة هام دوماً، ولكن يمكن أحياناً تتسبب في مشكلات مع نظم فرعية معينة WPF و تؤثر الاختيارات التي تجريها في العلامات أو التعليمات البرمجية.

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

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

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

الشجرة المنطقية

في WPF قم بإضافة المحتوى إلي عناصر واجهة المستخدم بواسطة إعداد خصائص الكائنات التي تقوم بنسخ تلك العناصر. على سبيل المثال، يمكنك إضافة عناصر إلى عنصر التحكم ListBox بواسطة معالجة خاصية Items . من خلال القيام بذلك، يتم وضع العناصر في ItemCollection هذه هي Items قيمة الخاصية. وبشكل مماثل، لإضافة كائنات إلى DockPanel ، تقوم بمعالجة قيمة الخاصية Children . هنا، يتم إضافة كائنات إلى ال UIElementCollection. مثال لتعليمات برمجية، راجع كيفية القيام بما يلي: إضافة عنصر بشكل حيوي.

في Extensible Application Markup Language (XAML) ، عند وضع عناصر القائمة في ListBox أو تحكم أو عناصر أخرى لواجهة المستخدم في DockPanel ، يمكنك أيضاً استخدام خصائص Items و Children بشكل صريح أو ضمني ، كما في المثال التالي.

<DockPanel
  Name="ParentElement"
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  >
  <!--implicit: <DockPanel.Children>-->
  <ListBox DockPanel.Dock="Top">
    <!--implicit: <ListBox.Items>-->
    <ListBoxItem>
      <TextBlock>Dog</TextBlock>
    </ListBoxItem>
    <ListBoxItem>
      <TextBlock>Cat</TextBlock>
    </ListBoxItem>
    <ListBoxItem>
      <TextBlock>Fish</TextBlock>
    </ListBoxItem>
  <!--implicit: </ListBox.Items>-->
  </ListBox>
  <Button Height="20" Width="100" DockPanel.Dock="Top">Buy a Pet</Button>
  <!--implicit: </DockPanel.Children>-->
</DockPanel>

إذا كنت تقوم بمعالجة هذا XAML كـ XML ضمن نموذج مستند كائن ، إذا كان يتم تضمين علامات تعليق في خارج ضمنياً (والذي قد يكون قانونيةً) ثم الشجرة XML DOM الناتج قد قامت بتضمين عناصر ل <ListBox.Items>و في العناصرالأخرى الضمنية . ولكن XAML لا يقوم بالمعالجة بهذه الطريقة عند قراءة العلامات وكتابة الكائنات، لا يتضمن الرسم البياني الناتج الكائن حرفياً ListBox.Items. ومع ذلك فإن لديها من الخاصية ListBox المسماة Itemsالتي تحتوي على ItemCollection وأن ItemCollection تتم تهيئة ولكن فارغ عندما يكون ال ListBox XAMLمعالج . ثم, كل عنصر كائن تابع موجود مثل محتوى ال ListBox يتم إضافه إلى ItemCollection بواسطة محلل المكالمات ل ItemCollection.Add. هذا المثال معالجة XAML إلى كائن شجرة هذا على ما يبدو مثال حيث كائن الشجرة الذي تم إنشاؤه بشكل أساسي هو شجرة منطقية.

ومع ذلك، فإن الشجرة المنطقية ليست هي كائن الرسم البياني الكائن لوجهة المستخدم للتطبيق الخاص بك في وقت التشغيل، حتى لو مع عناصر XAML لبناء الجملة الضمنية المحددة. السبب الرئيسي في هذا هو المرئيات والقوالب. على سبيل المثال، ضع في الاعتبار الـ Button. تقدم الشجرة المنطقية تقارير الكائن Button و السلسلة الخاصة به أيضاً Content. ولكن هناك المزيد لهذا الزر في كائن الشجرة وقت التشغيل. وبشكل خاص، يظهر الزر فقط على الشاشة بالطريقة التي تعمل لأن قالب عنصر التحكم المعين Button تم تطبيقه. المرئيات التي تأتي من قالب مطبق (مثل قالب المعرف من قبل Border من الرمادي الداكن حول الزر المرئي) لا يتم إعلامها في الشجرة المنطقية، حتى إذا كنت تبحث في الشجرة المنطقية أثناء وقت التشغيل (مثل معالجة حدث الإدخال من واجهة المستخدم المرئية ثم قراءة الشجرة المنطقية). للعثور علي بليد قالب المرئيات، عليك بدلاً من ذلك فحص الشجرة المرئية.

للحصول على معلومات حول كيفية تعين بناء الجملة XAML إلى رسم الكائن الذي تم إنشاؤه، وبناء الجملة الضمنية في XAML ، راجع بناء جملة XAML بالتفاصيل أو نظرة عامة على XAML (WPF).

الغرض من الشجرة المنطقية

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

بالإضافة إلى ذلك، يتم حل كلاً من مراجع المورد الثابتة و الحيوية و ذلك بالبحث إلي الأعلي من خلال الشجرة المنطقية للمجموعات Resources علي الكائن الطلب الأولي و من ثم المتابعة في الشجرة المنطقية و التدقيق في كل FrameworkElement (أو FrameworkContentElement) للحصول على القيمة آخري Resources التي تحتوي على ResourceDictionary و ربما تحتوي على هذا المفتاح. الشجرة المنطقية تستخدم للبحث عن المورد عندما كلاً من الشجرة المنطقية و الشجرة المرئية موجودتان. للحصول على مزيد من المعلومات حول قواميس المورد "و" البحث "، راجع نظرة عامة حول الموارد.

إنشاء الشجرة المنطقي

تعرف الشجرة المنطقية في مستوى إطار العمل WPF ، مما يعني أن عنصر WPF الأساسي الأكثر صلة بعمليات الشجرة المنطقية هو إما FrameworkElement أو FrameworkContentElement. على الرغم من ذلك، كما تري إذا استخدمت الـ API LogicalTreeHelper بالفعل، تحتوي الشجرة المنطقية أحياناً على العقد التي هي ليست FrameworkElement أو FrameworkContentElement. على سبيل المثال، تقدم الشجرة المنطقية تقارير القيمة Text الخاصة بـ TextBlock ، التي هي سلسلة.

تجاوز الشجرة المنطقية

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

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

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

الشجرة المرئية

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

الأشجار،محتويات العناصر و محتويات مضيفين

محتوى العناصر (فئات مشتقة من ContentElement) ليست جزء من الشجرة المرئية; لا ترث من Visual وليس لديك تمثيل مرئي. في ترتيب الظهور في كافة واجهة المستخدم ،لابد من استضافة ContentElement في محتوي المضيف في كل من Visual و المشاركين في الشجرة المنطقية. يكون عادةً مثل هذا كائن FrameworkElement. يمكنك تصور ان محتوى المضيف هو إلى حدٍ ما مثل "مستعرض" للمحتوى ثم اختيار كيفية عرض هذا المحتوى ضمن منطقة الشاشة التي يتحكم فيها المضيف. عندما يتم استضافة المحتوى ، يمكن جعل المحتوى مشارك في بعض عمليات شجرة المرتبطة بشكل طبيعي بالشجرة المرئية. بشكل عام، فئة المضيف FrameworkElement تتضمن رمز التطبيق الذي يضيف أي استضافة ContentElementالي توجيه الحدث عبر subnodes لمحتوي الشجرة المنطقية على الرغم من أن المحتوى المستضاف ليس جزءاً من الشجرة المرئية . يعد هذا ضرورياً بحيث ال ContentElement يمكنه ان يصدر حدث موجهة يقوم بتوجيه أي عنصر آخر غير نفسه.

شجرة اجتياز

الفئة LogicalTreeHelper توفر الطرق GetChildren ، GetParent ، و FindLogicalNodeلشجرة اجتياز منطقية. في معظم الحالات ، يجب أن لا تجتاز الشجرة المنطقية من عناصر التحكم الموجودة, لأن عناصر التحكم هذه دائما تعرض العناصر المنطقية التابعة لها كمجموعة خاصية مخصصة التي تدعم مجموعة الوصول مثل Add مفهرس ، و إلخ. بشكل رئيسي شجرة الاجتياز هي السيناريو المستخدمة من قبل كتّاب التحكم الذين اختاروا ألا ينحدر من أنماط السيطرة المقصود مثل ItemsControl أو Panel حيث تم تعريف خصائص المجموعة بالفعل, ويمكن للذين يرغبوا في توفير دعم مجموعة الخاصية.

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

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

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

توجيهات من أجل الأحداث الموجه مثل "شجرة"

كما ذكر من قبل ، توجيه أي أحداث موجهة يسافر على طول مسار واحد ومحدد مسبقاً لشجرة وهو مختلط لتمثيلات الشجرة المرئية و الشجرة المنطقية. يمكن للأحداث الموجهه السفر في الاتجاه الأعلى أو الأسفل ضمن الشجرة استناداً إلى ما إذا كانت الأحداث الموجهة أنفاق أو bubbling . مفهوم الأحداث الموجهةلا تدعم مباشرة فئة المساعد التي يمكن استخدامها لـ "تقود" الأحداث الموجهة بشكل مستقل عن رفع حدث بتوجه بالفعل . هناك فئة تمثل التوجيه EventRoute ، ولكن بشكل عام أساليب هذه الفئة للاستخدام الداخلي فقط.

قواميس الموارد و الأشجار

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

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

راجع أيضًا:

المبادئ

نظرة عامة حول المدخلات

نظرة عامة حول تقديم رسومات WPF

نظرة عامة حول الأحداث الموجهة

تهيئة عناصر كائن ليس موجود في شجرة الكائن

بنية WPF