اتجاه عقدة XAML Understوing بني و مفاهيم
كتاب و XAML القراء XAML تستند إلى مفهوم تصميم دفق عقدة XAML. دفق عقدة XAML هو conceptualization لمجموعة عقد XAML الموقع يقدم معالج XAML من خلال بناء علاقات عقدة في XAML واحد في الوقت. في أي إعطاء وقت، هناك هو واحد فقط للسجل الحالي أو الموضع الحالي داخل دفق عقدة XAML مفتوحة. أو، يكون الدفق عقدة في إنهاء ملف. يمكن وصف العقدة الحالي في دفق عقدة XAML كـ كائن ما، وعضو، أو القيمة. بالتعامل مع XAML باسم دفق عقدة XAML، يمكن الاتصال بكتاب XAML XAML القراء وقم بتمكين برنامج إلى عرض التعامل معها أو تبديل محتويات دفق عقدة XAML أثناء حفظ أو مسار تحميل عملية المسار الذي يتضمن XAML. XAML تصميم واجهة برمجة تطبيقات قارئ وكاتب والمفهوم دفق عقدة XAML تشبه تصميمات ذات الصلة القارئ/الكاتب السابق والمفاهيم، مثل كـ نموذج كائن مستند (DOM) XMLو XmlReader/ XmlWriter. يناقش هذا المقال المفاهيم دفق عقدة XAML و يصف كيف يمكنك كتابة إجراءات تتفاعل مع تمثيلات XAML على المستوى عقدة XAML.
يشمل هذا الموضوع على الأقسام التالية.
تحميل في قارئ XAML
تكرار حلقي عقدة قراءة أساسى
العمل مع عقدة الحالي
العبور وإدخال كائن العقد
تحميل في قارئ XAML
الأساس XamlReaderفئة لا تقوم بتعريف أسلوب معين لتحميل XAML الأولية في قارئ XAML. Th هو هو ترك إلى فئات فرعية. المعرفة من قبل الخدمات XAML إطار عمل.NET أكثر وضوحاً XamlReaderهو فئة فرعية XamlXmlReader. XamlXmlReaderيحمل XAML الأولى أما بواسطة تحميل نص ملف مباشرة من خلال الدفق أو ملف المسار، أو غير مباشر من خلال فصل دراسي قارئ ذات صلة مثلTextReader. بعد هذا تم تحميله الأولى: XamlReaderيمكن اعتبار أنها تحتوي على الكامل لملف XAML بعد ذلك قام بتحميل. ومع ذلك، XamlReaderالأساسية لواجهة برمجة تطبيقات تم تصميمها بحيث يتفاعل القارئ مع مفرد عقدة XAML. عند تم تحميله أولاً، هو اﻷول عقدة واحدة مواجهة جذر XAML.
تكرار حلقي عقدة قراءة أساسى
قرص أساسي قراءة تكرار حلقي عقدة لفحص دفق عقدة XAML يتكون من المفاهيم التالية. لأغراض حلقات عقدة كـ التي تمت مناقشتها في هذا الموضوع، وقراءة ملف XAML استخدام كـ sume XamlXmlReader. راجع الارتباطات الموجودة في هذا المقطع إلى تكرار حلقي عقدة XAML معينة API المطبقة بواسطة XamlXmlReader.
تأكد من أنك لست في إنهاء الدفق عقدة XAML. إذا كنت في نهاية الدفق، هناك هو لا عقدة الحالية والتي يجب إنهاء.
تحقق من نوع عقدة دفق عقدة XAML الكشف عن حاليا بواسطة استدعاء NodeType.
إذا كان لديك مقترنة XAML كائن، يمكنك بشكل عام يتصل
استناداً إلى أي XamlNodeTypeهو إرسال كالسجل الحالي/عقدة الحالي، باستدعاء واحد الخيارات التالية للحصول تشغيل معلومات حول محتويات عقدة:
NodeTypeمن StartMemberأو EndMember، باستدعاء Memberإلى الحصول على XamlMemberمعلومات العضو.
NodeTypeمن StartObjectأو EndObject، باستدعاء Typeإلى الحصول على XamlTypeمعلومات حول على الكائن.
For aNodeTypeofValue, يتصلValue. عقدة هو قيمة فقط إذا أنه هو أبسط التعبير الممكنة لقيمة لعضو، أو نص في تهيئة كائن.
NodeTypeمن NamespaceDeclaration، باستدعاء Namespaceإلى الحصول على معلومات مساحة الاسم لعقدة مساحة أسماء المصادر.
باستدعاء Readللتقدم القارئ XAML إلى العقدة التالية في دفق عقدة XAML، و اتبع الخطوات مرة أخرى.
دفق عقدة XAML توفير بواسطة القراء XAML الخدمات ل.NET Framework XAML دائماً بتوفير اجتياز كاملة أو بحث شامل لكل العقد المحتملة. تشمل التقنيات عنصر تحكم تدفق عام لحلقة عقدة XAML تعريف نص داخل while (reader.Read())، و تبديل تشغيل NodeTypeعند كل يؤشر العقدة في تكرار حلقي عقدة.
أبسط تكرار حلقي المحتملة التي تشتمل على قارئ و كاتب قد يشبه ما يلي:
XamlXmlReader xxr = new XamlXmlReader(new StringReader(xamlStringToLoad);
//where xamlStringToLoad is a string of well formed XAML
XamlObjectWriter xow = new XamlObjectWriter(xxr);
while (xxr.Read()) {
xow.WriteNode(xxr);
}
هذا المثال أساسى من تكرار حلقي عقدة XAML مسار تحميل الكاتب و XAML القارئ XAML يتصل بشكل شفاف، القيام بأي شيء مختلف عن لو لو أنك استخدمت XamlServices.Parse. ولكن th هو البنية أساسى هو ثم موسّع تطبيق للقراءة أو الكتابة السيناريو الخاص بك. تقوم بعض السيناريوهات المحتملة كـ التالي:
تبديل تشغيلNodeType. تنفيذ الاجراءات مختلفة بالاعتماد تشغيل نوع العقدة هو قراءتها.
لا يتصل WriteNodeفي الجميع الحالات. استدعاء فقط WriteNodeفي بعض NodeTypeالحالات.
ضمن منطق تسلسل لنوع عقدة معينة بتحليل مواصفات تلك العقدة و التصرف بناء عليها. على سبيل المثال، قد تقوم بكتابة الكائنات التي تأتي من مساحة اسم معينة XAML، و ثم إسقاط أو تأجيل أية كائنات وليس من مساحة الاسم XAML هذا. أو يمكن إفلات أو وإلا reprocess أي توجيهات XAML يعتمد النظام XAML كـ جزءا من الأعضاء المعالجة.
تعرف على مخصص XamlObjectWriterالذي يتجاوز Write*أساليب، ربما تقوم بتعيين نوع يتجاوز XAML مخطط سياق.
الوصول إلى XAML وراء عقدة تكرار حلقي المفهوم
هناك طرق غير ذلك من المحتمل أن يكون للعمل مع تمثيل XAML خلاف كعقدة XAML تكرار حلقي. على سبيل المثال، قد توجد هناك قارئ XAML يمكنه قراءة في dexed عقدة، أو في الخاصة بالوصول إلى العقد مباشرة بواسطة x:Name، حسب x:Uid، أو من خلال غير ذلك معرفات. لا يوفر تنفيذ كامل خدمات XAML إطار عمل.NET، ولكن يوفر نمط مقترحة من خلال الخدمات و تعتمد أنواع. للمزيد من المعلومات، راجع IXamlIndexingReader وXamlNodeList.
العمل مع عقدة الحالي
معظم الحالات التي تستلزم العمل مع تكرار حلقي عقدة XAML ليس فقط قراءة العقد. معظم سيناريوهات بمعالجة العقد الحالي من خلال بعض المنطق، ثم و تمرير كل عقدة واحدة في مرة الواحدة إلى تطبيق XamlWriter.
للعامة تحميل مسار السيناريو، XamlXmlReaderينتج عن دفق عقدة XAML، ربما تتم معالجة العقد XAML في سياق المخطط و XAML منطق، و ثم العقد التي تم تمريرها إلى XamlObjectWriter. بعد ذلك، يمكنك دمج الناتج عن عملية الدمج كائن الرسم البياني في تطبيق أو Framework الخاص بك.
للمشترك حفظ السيناريو مسار، XamlObjectReaderيقرأ الكائن الرسم البياني، تتم معالجة العقد XAML الفردية، و XamlXmlWriterإخراج نتيجة تحويل بياناتها إلى ملف كملف XAML نص. المفتاح هنا هو كل من المسارات/سيناريوهات تستلزم العمل في عقدة XAML واحد في مرة الواحدة، والعقد XAML المتوفرة للمعاملة بطريقة قياسية التي هو المعرفة من قبل النظام نوع XAML وواجهة برمجة تطبيقات الخدمات XAML إطار عمل.NET عام.
إطارات و نطاق
تكرار العقدة XAML مفهوم الأصل هو walking من خلال تدفق عقدة XAML بطريقة خطية. traverses الدفق عقدة في الكائنات، في الأعضاء التي تحتوي تشغيل كائنات غير ذلك، وهكذا. هو غالباً مفيدة لمعرفة نطاق داخل الدفق عقدة XAML بتنفيذ مفهوم اطار/بنيه تخزين العناصر. يكون هذا صحيحاً خاصة إذا كان يتم فاعلية ضبط الدفق عقدة أثناء عملك فيه. دعم الاطار/بنيه تخزين العناصر التي قمت بتطبيق كـ هو جزء من منطق تكرار حلقي العقد الخاص بك بحساب StartObject(أوGetObject) و EndObjectنطاقات كـ تصاعد في بنية عقدة XAML إذا تم اعتبار البنية من منظور DOM.
العبور وإدخال كائن العقد
كما ذكر سابقا، أول عقدة في دفق عقدة عند فتحه بقارئ XAML هي العقدة البدء-الكائن للكائن الجذر. بالتعريف، رقم هو الكائن هو دائماً واحدة الكائن عقدة، وقد لا توجد نظائر. في المثال XAML أي الحقيقي "، سوف يتم تعريف الكائن الجذر إلى تحتوي خاصية واحدة أو أكثر تحتوي على الكائنات أكثر، وسيكون هذه الخصائص للعقد عضو. العقد عضو ثم عقد كائن واحد أو أكثر، أو ربما أيضا termفيate في القيمة عقدة في stead.
خذ بعين الاعتبار المثال التالي XAML (هذا هو XAML عشوائية، لا النسخ بالموجود أنواع في.NET Framework). هو التعليق XAML مع تعليقات XML تمييز نوع العقدة على حل كل ناحية ترميز ضمن، عند عرض كـ دفق عقدة XAML. تفترض التي في هذا كائن صياغة FavorCollectionهو List<T>من Favor، Balloonو NoiseMakerيتم قابل للتعيين إلى Favor، Balloon.Colorيتم نسخ الخصائص Colorكائن مشابهة لكيفية تعريف WPF الألوان، و Colorيدعم محوّل نوع لبناء جملة السمة.
ترميز XAML |
دفق عقدة XAML الناتجة |
---|---|
<Party |
Namespace عقدة Party |
xmlns="PartyXamlNamespace"> |
StartObject عقدة Party |
<Party.Favors> |
StartMember عقدة Party.Favors |
StartObject عقدة ضمني FavorCollection |
|
StartMemberعقدة الضمنيFavorCollectionخاصية عناصر. |
|
<Balloon |
StartObject عقدة Balloon |
Color="Red" |
StartMember عقدة Color Value عقدة لالقيمة السمة سلسلة "Red" EndMember من اجل Color |
HasHelium="True" |
StartMember عقدة HasHelium Value عقدة لالقيمة السمة سلسلة "True" EndMember من اجل HasHelium |
> |
EndObject من اجل Balloon |
<NoiseMaker>Loudest</NoiseMaker> |
StartObject عقدة NoiseMaker StartMember عقدة _Initialization Value عقدة لسلسلة القيمة تهيئة "Loudest" EndMember عقدة _Initialization EndObject من اجل NoiseMaker |
EndMemberعقدة الضمنيFavorCollectionخاصية عناصر. |
|
EndObject عقدة ضمني FavorCollection |
|
</Party.Favors> |
EndMember من اجل Favors |
</Party> |
EndObject من اجل Party |
في دفق عقدة XAML، يمكنك الاعتماد تشغيل المشكلات التالية:
إذا Namespaceexهوts عقدة تشغيل أي StartObjectأو StartMember، هو وضع في الدفق قبل التي StartObjectأو StartMember. انظر إلى الجدول السابق مع XAML و دفق العقدة المثال مرة أخرى. إشعار كيف StartObjectو Namespaceتبدو وكأنها عقد إلى يمكن تحويل مقابل مواضعها التصريح في ترميز. Th هو هو ممثل سلوك الموقع تظهر عقدة(s) مساحة الاسم دائماً متقدماً للعقدة ويتم تطبيقها على في دفق عقدة. الغرض من هذا التصميم هو أن المعلومات مساحة أسماء المصادر أهمية لكتاب الكائن، ويجب أن تكون معروفة من قبل أية محاولة للقيام بنوع mapping أو غير ذلك عملية الكائن أو عضو. وضع أي مساحة الاسم يتأخر عن نطاقه تطبيق في الدفق يجعل أبسط إلى دائماً معالجة دفق عقدة في ترتيبها قدمناها
وبسبب اعتبار أعلاه، فإنه هو أو أكثر Namespaceالعقد قراءة أولاً في معظم الحالات ترميز الحقيقي عند العبور العقد من البداية، لا StartObjectللجذر.
AStartObjectعقدة can be followed بواسطةStartMember,Value, أو an فوريEndObject. يمكن أيضا أن يتبعها Namespaceعقدة، إذا كانت مساحة الاسم إعلان موجود بشكل واضح تشغيل هذا الكائن. هو لا متبوعاً مباشرة آخر StartObject.
StartMemberيمكن أن يتبع بواسطة StartObject، Value، أو الفوري EndMember. يمكن أيضا أن يتبعها Namespaceعقدة، وإذا كان تصريح مساحة الاسم موجود بوضوح تشغيل ذلك العضو. هو لا متبوعاً مباشرة آخر StartMember.
Valueتمثل عقدة القيمة نفسها؛ هو لا يوجد "EndValue". يمكن أن تتبع فقط بواسطة EndMember.
XAML النص تهيئة الكائن كـ قد ليتم استخدامها من قبل ولا تؤدي الإنشاء على بنية كائنات ذات القيمة. بدلاً من ذلك، يسمى عقدة أعضاء مخصصة لأعضاء _Initializationهو إنشاء. و تلك العقدة عضو يحتوي على سلسلة الالقيمة تهيئة. إذا كان ذلك exهوts, _Initializationهو دائماً أول StartMember. _Initializationقد يكون مؤهلاً في بعض تمثيلات الخدمات XAML مع namescope XAML لغة XAML، لتوضيح التي_Initializationهو ليس خاصية معرفة في النسخ لأنواع.
أ عضو-يمثل تركيبة القيمة إعداد سمة القيمة. أخيرا فقد يوجد محوّل قيمة المتضمنة في معالجة هذه القيمة. ومع ذلك، التي هو لا تقييم حتى يعالج كاتب كائن XAML th هو دفق عقدة. الكاتب كائن XAML possesses الضرورية XAML سياق المخطط، نظام نوع التعيين، و الدعم الأخرى المطلوبة لتحويل القيمة.
EndMemberعقدة يمكن أن يتبعها StartMemberعقدة لعضو لاحقة، أو بواسطة EndObjectعقدة لمالك العضو.
EndObjectيمكن أن يتبع عقدة بواسطة EndMemberعقدة. فإنه يمكن أيضا بأنه بواسطة StartObjectعقدة للحالات الموقع تكون الكائنات النظراء في عن مجموعة عناصر.
- لحالة فريدة من إغلاق الدفق العقدة بالكامل، EndObjectمن الجذر لا يتبعها أى شىء؛ القارئ الآن إنهاء-من-الملف، و Readبإرجاع false.
القيمة محوّلات وفي اتجاه عقدة XAML
محوّل قيمة هو مصطلح عام لملحق علامات، محوّل نوع (بما في ذلك القيمة serializers) أو فئة مخصصة أخرى والتي يتم عرضها كمحول قيمة من خلال النظام نوع XAML. في دفق عقدة XAML، استخدام محوّل نوع ترميز أن استخدام ملحق تمثيلات مختلفة جداً.
نوع محوّلات في اتجاه XAML عقدة
استخدام محوّل نوع هو الذي تم الإعلام عنه في دفق عقدة XAML كقيمة داخل عضو. لم محاولة دفق عقدة XAML إلى إنتاج كائن مثيل نوع محوّل وتمرير القيمة إلى عليه. يؤدي القيام بذلك قد تتطلب باستدعاء سياق المخطط XAML و استخدامه لتعيين نوع. حتى تحديد التي نوع الفئة محوّل يستخدم لمعالجة القيمة يتطلب سياق XAML المخطط بشكل غير مباشر. على الأقل عند استخدام الافتراضي XAML سياق المخطط، تلك المعلومات هو المتوفرة من نظام نوع XAML إذا كنت بحاجة نوع معلومات فئة المحوّل على المستوى XAML عقدة الدفق قبل للاتصال بكاتب XAML، يمكن الحصول عليه من XamlMemberمعلومات العضو الذي يتم تعيين.
على سبيل المثال، يجب مراعاة التالي فئة تعريف مخطط تفصيلي و XAML الاستخدام الخاص به:
public class BoardSizeConverter : TypeConverter {
//converts from string to an int[2] by splitting on an "x" char
}
public class GameBoard {
[TypeConverter(typeof(BoardSizeConverter))]
public int[] BoardSize; //2x2 array, initialization not shown
}
<GameBoard BoardSize="8x8"/>
يمكن أن يتم التعبير عن تمثيل نص دفق عقدة XAML لهذا الاستخدام كـ ما يلي:
StartObjectمعXamlTypeيمثلGameBoard
StartMemberمعXamlMemberيمثلBoardSize
Valueعقدة، مع السلسلة النصية "8x8"
EndMember التلائمات BoardSize
EndObject التلائمات GameBoard
لاحظ أنه هو لا يوجد مثيل محوّل النوع في ترتيب هو دفق عقدة. وقد تحصل تشغيل معلومات محوّل النوع بواسطة استدعاء XamlMember.TypeConverterتشغيل XamlMemberل BoardSize. لذا طويلة كـ لديك سياق صالح لمخطط XAML، يمكنك أيضا استدعاء الأساليب المحول بالحصول على مثيل من ConverterInstance.
ملحقات ترميز في اتجاه XAML عقدة
استخدام ملحق علامات هو المسجلة في الدفق عقدة XAML كوجود عقدة كائن داخل عضو، الموقع يمثل الكائن مثيل ملحق علامات. وهكذا استخدام ملحق علامات هو المقدمة أكثر بوضوح في تمثيل دفق العقد من محوّل نوع هو. XamlMemberمعلومات قد لا يكون إخبارك لك أى شىء حول ملحق ترميز، لأن الاستخدام الموقف وتختلف في كل cكـe ترميز المحتملة؛ وهي ليست مخصصة وضمني كل نوع أو عضو كـ هو cكـe مع نوع محوّلات.
دفق العقدة تمثيل لملحقات ترميز كـ كائن العقد هو cكـe حتى w استخدام ملحق ترميز كـ بها في النموذج السمة (الذي غالباً ما يكون cكـe). يتم التعامل مع الاستخدامات ملحق ترميز التي تستخدم نموذج عنصر كائن صريحة بنفس الطريقة.
ضمن عقدة كائن ملحق ترميز، قد يكون هناك الأعضاء في ذلك الملحق ترميز. تمثيل دفق عقدة XAML يحتفظ باستخدام تلك ترميز ملحق، سواء التي يتم استخدام معلمة الموضعية أو استخدام مع صريح المعلمات المسماة.
استخدام معلمة الموضعية، دفق عقدة XAML يحتوي على خصائص المعرفة بواسطة لغة XAML _PositionalParametersالسجلات التي في الاستخدام. Th هو خاصية هو عام List<T>مع Objectقيد. قيد هو الكائن وليس سلسلة أحرف لأن حدود الإمكان استخدام معلمة الموضعية قد تحتوي على استخدامات ملحق ترميز المتداخلة الموجودة بداخله. للوصول إلى المعلمات الموضعية من استخدم، قد يكرر خلال القائمة و استخدام مفهرسات لقيم القائمة الفردية.
استخدام معلمة مسماة، باسم كل معلمة هو ممثلة بعقدة عضو بهذا الاسم في دفق عقدة. عضو قيم غير الضرورة السلاسل، نظراً لأنه قد يكون هناك المتداخلة ترميز استخدام ملحق.
ProvideValueمن الملحق ترميز هو لم يتم استدعاؤه. ومع ذلك، فإنه سيتم استدعاؤه حالة توصيل قارئ XAML و XAML كاتب مثل تلك WriteEndObjectهو باستدعاء تشغيل عقدة بملحق ترميز بمجرد أن يتم فحص في دفق العقدة. لهذا reكـon، بشكل عام تحتاج نفس XAML سياق المخطط المتوفرة كـ هل يمكن استخدام إلى نموذج كائن الرسم البياني تشغيل مسار تحميل. وإلا، ProvideValueأي ترميز الملحق يمكن يحتمل أن يكون الإلقاء الاستثناءات هنا، لأنه لم يكن المتوقعة من الخدمات متوفر.
XAML و XML المعرف من قبل اللغة الأعضاء في اتجاه XAML عقدة
يتم تقديم بعض الأعضاء إلى دفق عقدة XAML نظراً ل interpretations و اصطلاحات القارئ XAML، بدلاً من أن يكون ذلك من خلال صريحة XamlMemberالبحث أو البناء.
نص تهيئة لوجود عقدة كائن: هو الاسم الخاص بهذه العقدة العضو _Initialization، وأنه تم تحديد في مساحة الاسم XAML اللغة XAML. يمكنك يحصل كيان ثابت عنه من Initialization.
الموضعية المعلمات لملحق علامات: هو الاسم الخاص بهذه العقدة العضو _PositionalParameters، وأنه تم تحديد في مساحة الاسم XAML اللغة XAML. ويتضمن دائماً lهوt عام للكائنات، كل منها هو pre-separated معلمة الموضعية بتقسيم تشغيل ,حرف المحدد. يمكنك يحصل كيان ثابت عنه من PositionalParameters.
محتوى غير معروف: هو الاسم الخاص بهذه العقدة العضو _UnknownContent. وبشكل حصرا، هو XamlDirective، وهو هو المعرفة في لغة XAML XAML مساحة الاسم. يستخدم هذا التوجيه sentinel للحالات الموقع يحتوي على عنصر كائن XAML على المحتوى في مصدر XAML لكن يمكن تحديد خاصية لا يوجد محتوى ضمن سياق المخطط XAML متوفر. يمكنك الكشف عن هذه الحالة في دفق عقدة XAML بالبحث عن الأعضاء باسم _UnknownContent. في حالة لا إجراء آخر هو التي تم التقاطها في تحميل مسار XAML عقدة دفق، الافتراضي XamlObjectWriterسيتم طرح حاولت WriteEndObjectعندما يواجه _UnknownContentعضو في أي كائن. افتراضي XamlXmlWriterلم الإلقاء، ويعامل العضو كـ الضمنية. يمكنك يحصل وحدة ثابتة ل _UnknownContentمن UnknownContent.
معرف من قبل XML الأعضاء: تعريف XML للأعضاء xml:base، xml:langو xml:spaceيتم الإعلام عنها كـ الأعضاء المسمى base، lang، و spaceعلى التوالي. مساحة الاسم لهذه هو مساحة اسم XML http://www.w3.org/XML/1998/namespace. يمكن الحصول على ثوابت لكل منهما من XamlLanguage.