WPF XAML Namescopes
XAML namescopes i, مفهوم يتم تمثيل كائنات تخزين العلاقات بين أسماء XAML المعرفة للكائنات و معادلاتها. XAML namescopes في WPF يتم إنشاء تعليمات برمجية تمت إدارتها أثناء تحميل الصفحات من أجل XAML التطبيق. namescopes XAML كالكائنات البرمجية المعرفة بواسطة واجهة INameScope و يتم أيضاً تطبيقها بواسطة فئة NameScope العملية.
يشتمل هذا الموضوع على الأقسام التالية.
- Namescopes في تطبيقات XAML المحملة
- ِْْXAML Namescopes في الأنماط و التنسيقات
- XAMLnamescope و APIs ذات الصلة fالاسم
- موضوعات ذات صلة
Namescopes في تطبيقات XAML المحملة
في برمجة أوسع أو سياق علم الكمبيوتر مفاهيم البرمجة غالباً تتضمن مبدأ معرف فريد أو اسم يمكن استخدامه للوصول إلى كائن. بالنسبة للأنظمة التي تستخدم معرفات أو أسماء مثل هذا، تعرّف namescope الحدود للبرنامج أو التقنية التى ستبدو داخلها إذا طلب كائن الاسم، أو فرض حدود تفرد الأسماء. يتم إنشاء namescopes XAML على العنصر الجذرى لـ XAML الصفحة عند معالجة الصفحة. إضافة كل اسم محدد داخل صفحة XAML الى namescope XAML ذات صلة. عناصر العناصر الجذرية الشائعة (مثل Page ، و Window) دوماً تتحكم namescope XAML. إذا كان عنصر مثل FrameworkElement أو FrameworkContentElement هو العنصر الجذرى من الصفحة في العلامات ، XAML يضيف المعالج Page الجذر ضمنيًا بحيث يمكن توفير Page namescope XAML. يتم إنشاء namescope XAML حتى إذا لم يتم تعريف سماتName أو x:Name على أي عناصر في XAML مبدئياً.
إذا حاولت استخدام نفس الاسم مرتين في أي namescope XAML ، فسيتم رفع استثناء. للحصول على XAML يحتوي على التعليمات البرمجية الخلفية ويعتبر جزءًا من أحد التطبيقات المترجمة هذا الاستثناء يظهر عند إنشاء الفئة الذي تم إنشاؤها أثناء التحويل البرمجي للعلامات الأولية.
إضافة عناصر لأشجار تحليل العنصر
أية إضافات لشجرة العنصر بعد التحميل الأول والمعالجة يجب استدعاء التطبيق المناسب ل RegisterName فئة الذي يعرف XAML namescope. وإلا، لا يمكن أن يكون الرجوع الى كائن تمت إضافته بالاسم خلال أساليب مثل FindName. مجرد إعداد خاصيةName (أو س: اسم السمة) لا يتم تسجيل هذا الاسم في أي XAML namescope . إضافة عنصر مسمى لشجرة عنصر لها XAML namescope أيضاً لا يتم تسجيل الاسم الى XAML namescope . على الرغم من أنه يمكن أن تتداخل XAML namescopes ، يمكنك تسجيل أسماء XAML namescope الموجودة بشكل عام على العنصر الجذرى ، بحيث يوازى موقع XAML namescopeال XAML namescope الآخر الذى قد يكون تم إنشاؤها في تحميل مكافئ لصفحة XAML . السيناريو الأكثر شيوعاً لمطوري التطبيقات هو استخدام RegisterNameبأسماء regهوter في namescope XAML تشغيل جذر الحالي من الصفحة. RegisterNameهو جزء من سيناريو هام واحد للبحث عن storyboards التي ستعمل كحركات. لمزيد من المعلومات، راجع نظرة عامة حول لوحات العمل. فى حالة استدعاء RegisterName على عنصر غير العنصر الجذرى في شجرة كائن ما بنفس الاسم ال1ى لا يزال مسجل على العنصر الأقرب للجذر، كما لو كان قد تماستدعاء RegisterName على العنصر الجذرى.
XAML Namescope فى التعليمات البرمجية
يمكنك إنشاء XAML namescopes واستخدامها في التعليمات البرمجية. APIs في hgاستخدام والمفاهيم المتضمنة هي نفسها حتى فى استخدام التعليمات البرمجية فقط ، لأن معالج XAML من أجل WPF يستخدم هذه APIs والمفاهيم عندما يقوم بمعالجة XAML نفسه، توجد المفاهيم و API بشكل أساسي من أجل إمكانية البحث عن الكائنات حسب الاسم داخل كائن الشجرة التي يتم عادة تعريفه جزئيًا أو بالكامل في XAML.
فى التطبيقات التي يتم إنشاؤها بطريقة برمجية و وليس من التحميل XAML ، يجب أن تقوم بتنفيذ العنصر الجذر INameScope, أو الفئة FrameworkElement أو FrameworkContentElement المشتقة ليعتمد XAML namescope .
أيضاً، لأي عنصر لم يتم تحميله ويتم معالجتها بواسطة XAML لا يتم إنشاء المعالج XAML namescope للكائن أو تهيئته افتراضياً. يجب عليك بشكل صريح إنشاء XAML namescope جديدة لأي عنصر ترغب في تسجيل الأسماء فيه فيما بعد. لإنشاء XAML namescope ، استدعاء أسلوبSetNameScope الثابت. حدد الكائن الذي ستملكه كـمعلمة dependencyObject ، و مُنشئ NameScope استدعاء جديد كمعلمةvalue .
في حالة توفير الكائن باسم dependencyObject لـ SetNameScope ليس تطبيق INameScopeFrameworkElement أو FrameworkContentElement ، ثم استدعاء RegisterName على أي عنصر تابعة لن يكون له أدنى تأثير. إذا فشلت في إنشاء XAML namescope جديد بشكل صريح، إذا استدعاء RegisterName سوف يرفع استثناء.
لمثال حول استخدام XAML namescope واجهات API في التعليمات البرمجية "، راجعكيفية القيام بما يلي: تعريف نطاق اسم.
ِْْXAML Namescopes في الأنماط و التنسيقات
الأنماط والقوالب في WPF توفر إمكانية إعادة الاستخدام "و" إعادة تطبيق المحتوى في طريقة عملية مباشرة، و لكن الأنماط والقوالب قد تتضمن أيضاً عناصر ذات أسماء معرفة لدى مستوى القالب. قد يتم استخدام نفس القالب عدة مرات فى الصفحة. لهذا السبب، تعرف كلا من الأنماط والقوالب XAML namescopes الخاصة بهم ، مستقلة عن الصفحة المحتوية حيث يتم تطبيق نمط أو قالب.
الرجاء مراجعة المثال التالي:
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
>
<Page.Resources>
<ControlTemplate x:Key="MyButtonTemplate" TargetType="{x:Type Button}">
<Border BorderBrush="Red" Name="TheBorder" BorderThickness="2">
<ContentPresenter/>
</Border>
</ControlTemplate>
</Page.Resources>
<StackPanel>
<Button Template="{StaticResource MyButtonTemplate}">My first button</Button>
<Button Template="{StaticResource MyButtonTemplate}">My second button</Button>
</StackPanel>
</Page>
هنا يتم تطبيق نفس القالب على زرين مختلفة. إذا لم لدى القوالب XAML namescopes منفصلة TheBorder الاسم المستخدم في القالب يؤدي إلى حدوث تضارب اسم. يتضمن كل مثيل للقالب XAML namescope الخاصة به لذا في هذا المثال كل إنشاء مثيل الخاص بقالب ما ستحتوي XAML namescope على اسم واحد فقط.
تعرف الأنماط أيضاً XAML namescopes الخاصة بهم ، بشكل كبير بحيث أجزاء من لوحات العمل لها أسماء معينة. تمكن هذه الأسماء من التحكم فى سلوك محدد يستهدف عناصر هذا الاسم حتى إذا تم اعادة تعريف القالب كجزء من تخصيص التحكم.
وبسبب XAML namescopes المنفصلة، العثور على العناصر المسماه في القالب تشكل تحدياً أكبر من العناصر غير المقولبة المسماه في صفحة. تحتاج أولاً الى تحديد قالب لتطبيقه عن طريق الحصول على قيمة خاصية Template لعنصر التحكم حيث يتم تطبيق القالب. ثم، يمكنك استدعاء إصدار قالب FindName ، ممرراً عنصر التحكم حيث تم تطبيق القالب كـ المعلمة الثانية.
إذا كنت كاتب عنصر تحكم و تقوم بإنشاء اصطلاح حيث يكون عنصر مسمى معين في قالب مطبق هو الهدف للسلوك الذي تم تعريفه بواسطة عنصر التحكم نفسه, يمكنك استخدام أسلوب GetTemplateChild تنفيذ التعليمات البرمجية عنصر التحكم الخاصة بك . أسلوبGetTemplateChild محمي ، بذلك الكاتب التحكم فقط له الحق فى الاتصال به.
إذا كنت تعمل ضمن قالب ، و تحتاج للوصول إلى XAML namescope حيث يتم تطبيق القالب ، يمكنك الحصول على قيمة TemplatedParent ، ومن ثم استدعاء FindName هناك. مثال عن العمل داخل القالب يمكن إذا كانت كتابة تطبيق معالج الحدث حيث يظهر الحدث من عنصر في قالب مطبق.
XAMLnamescope و APIs ذات الصلة fالاسم
FrameworkElement لديه FindName ،RegisterName و أساليبUnregisterName. في حالة استدعاء هذه الطرق على الكائن يتملك XAML namescope ، استدعاء الأساليب إلى أساليب ذات الصلة ب XAML namescope. Otherwهوe والعنصر الأصل هو التحقق مما إذا كانت تملك XAML namescope، وترتيب هو وتستمر العملية بشكل متكرر حتى XAML namescope هو العثور على (وبسبب XAMLسلوك معالج حدث هو يضمن أن يكون namescope XAML من جذر). FrameworkContentElementعلى السلوكيات مماثل، مع استثناء الذي لاFrameworkContentElementسوف تمتلك ذي namescope XAML. توجد الأساليب على FrameworkContentElement بحيث يمكن توجيه المكالمات أخيراً الى عنصر FrameworkElement الأصل.
SetNameScope يُستخدم لتعيين XAML namescope جديد الى كائن موجود. يمكنك استدعاء SetNameScope أكثر من مرة واحدة لإعادة تعيين أو مسح XAML namescope ولكن هذه ليست شائعة الاستخدام. أيضاً، GetNameScope لا يُستخدم عادةً من التعليمات البرمجية.
تطبيقات XAML namescopesc
تنفيذ الفصول الدراسية التالية INameScope مباشرة:
ResourceDictionaryلا تستخدم أسماء XAML أو namescopes; إنه يستخدم مفاتيح بدلاً من ذلك، نظرًا لأنه تطبيق القاموس. السبب الوحيد لذلك أن ResourceDictionaryيقوم بتنفيذ INameScope لذا فإنه يمكن رفع استثناءات لتعليمات برمجية للمستخدم التي تساعد على توضيح الفرق بين XAML namescope صحيحاً وكيفية معالجة ResourceDictionary للمفاتيح، وكذلك ضمان عدم تطبيق معالجة namescopes الى ResourceDictionary بواسطة عناصر الأصل.
FrameworkTemplate وStyle تطبقINameScope خلال تعريفات واجهة صريحة . تسمح التطبيقات الصريحة لهذه XAML namescopes لتتصرف اعتبارياً عندما يتم الوصول إليها عبر واجهة INameScope ، وهو كيفية اتصال XAML namescopes بواسطة WPF العمليات الداخلية. تعريفات الواجهة الواضحة ليست جزء من سطح API الاصطلاحية FrameworkTemplate و Style ، لأنك نادراً ما تحتاج لاستدعاء أساليب INameScope على FrameworkTemplate و Style مباشرةً، و بدلاً من استخدام API أخرى مثل GetTemplateChild.
تعرف الفصول الدراسية التالية XAML namescope الخاصة بهم باستخدام System.Windows.NameScope فئة المساعد والاتصال ب تطبيق XAML namescope به خلال خاصية NameScope.NameScope المرفقة: