TypeConverters و XAML

يقدم هذا الموضوع الغرض من التحويل من السلسلة كميزة عامة لغة XAML. في .NET Framework تخدم الفئة TypeConverter غرض معين كجزء من التطبيق لفئة مخصصة مدارة والتي يمكن استخدامها كقيمة خاصية في استخدام سمات XAML إذا كنت تكتب فئة مخصصة وتريد مثيلات للفئة الخاصة بك لتكون قابلة للاستخدام كقيم سمات XAML قابلة للتعيين، قد تحتاج إلى تطبيق TypeConverterAttribute إلى الفئة الخاصة بك، قم بكتابة فئة TypeConverter مخصصة أو كليهما.

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

  • مفاهيم تحويل النوع
  • تطبيق محول نوع
  • تطبيق TypeConverterAttribute
  • موضوعات ذات صلة

مفاهيم تحويل النوع

XAML وقيم السلسلة

عند تعيين قيمة سمة في ملف XAML النوع الأولي لهذه القيمة هو سلسلة في نص خالص. الأوليات حتى الأخرى مثل Doubleسلاسل نصية مبدئياً لمعالج XAML.

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

استخدام سلوك التحويل الموجود في XAML

اعتماداً على معرفتك بمفاهيم XAML الأساسية قد بالفعل تكون تستخدم سلوك التحويل في تطبيق XAML الأساسي دون أن تدرك ذلك. على سبيل المثال، يعرف WPF مئات الخصائص التي تأخذ قيمة من النوع Point. Point هى قيمة توضح إحداثي في مساحة إحداثيات ثنائية الأبعاد و فعلاً فهى تحتوي فقط على خاصيتين هامة: X وY عند تحديد نقطة في XAML فانك تحدد ذلك كسلسلة بمحدد (عادةً فاصلة) بين القيم X و Y التي تدخلها. فعلى سبيل المثال: <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">.

حتى هذا النوع البسيط من Pointواستخدامها البسيط في XAML يتضمن محول نوع. في هذه الحالة هذه هى الفئةPointConverter.

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

<LinearGradientBrush>

<LinearGradientBrush.StartPoint>

<Point X="0" Y="0"/>

</LinearGradientBrush.StartPoint>

<LinearGradientBrush.EndPoint>

<Point X="1" Y="1"/>

</LinearGradientBrush.EndPoint>

<LinearGradientBrush>

استخدام سلسلة تحويل نوع أو بناء جملة مكافئ مطوّل أكثر بشكل عام هو مجرد مسألة اختيار لطريقة كتابة التعليمات البرمجية. سير العمل الخاص بـ XAML الخاص بك قد أيضاً يؤثر فى كيفية تعيين القيم. بعض أدوات XAML تميل إلى إرسال النموذج الأكثر مطول ترميز لأنه من السهل round-trip بطرق عرض المصمم أو تقنية إنشاء تسلسل الخاص به.

يمكنك بشكل عام أن تكتشف محولات النوع الموجودة على WPF وأنواع .NET Framework عن طريق التحقق من فئة (أو خاصية) وجود تطبيق TypeConverterAttribute. هذه السمة سوف تعطى اسماً للفئة التي تدعم محول النوع للقيم من هذا النوع بالنسبة لأغراض XAML وكما قد تكون لأغراض أخرى.

محولات النوع وملحقات العلامات

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

حالة عام واحدة بحيث يكون ملحق علامات الضرورية بدلاً من محوّل نوع هو إجراء مرجع إلى كائن موجود بالفعل. في أفضل محوّل نوع عديم الحالة يمكن فقط توليد مثيل جديد، قد لا يكون مطلوباً. للحصول على المزيد من المعلومات على ملحقات العلامات راجع ملحقات ترميز و XAML WPF.

محولات الأنواع الأصلي

في تطبيقات WPF و .NET Framework لمحلل XAML هناك أنواع معينة التي يكون لها معالجة تحويل النوع الأصلي ليست بعد أنواعاً قد يمكن اعتبارها من الأوليات. مثال لمثل هذا النوع هو DateTime. والسبب في ذلك يعتمد على كيفية عمل هندسة .NET Framework: the نوع DateTime هو defined في mscorlib, the most أساسى مكتبة في .NET. DateTime ليس permitted إلى be attributed مع an سمة that comes من another تجميع that introduces a تبعية (TypeConverterAttribute هو من النظام) so the usual نوع محوّل اكتشاف mechanism بواسطة attributing cannot be supported. بدلاً من ذلك، يحتوي محلل XAML على قائمة من الأنواع التي تحتاج معالجة أصلية ويقوم بمعالجة هذه الأنواع بنفس كيفية معالجة الأوليات. (في حالة DateTime هذا يتضمن استدعاء لـ [M:System.DateTime.Parse(System.String))].

تطبيق محول نوع

TypeConverter

في مثال Point السابق، تم ذكر الفئة PointConverter. للحصول على تطبيقات .NET الخاصة بـ XAML، كافة محولات النوع التي يتم استخدامها لأغراض XAML هى فئات مشتقة من الفئة الأساسية TypeConverter. الفئة TypeConverter التي كانت موجودة في إصدارات .NET Framework التي تسبق وجود XAML; أحد الاستخدامات الأصلية الخاصة بها كانت لتوفير تحويلات سلسلة لخاصية مربعات الحوار في المصممين المرئيين. للحصول على XAML يتوسع الدور TypeConverter ليشمل الفئة الأساسية من أجل التحويل لسلسلة ومن السلسلة التي تمكن تحليل قيمة سمة السلسلة ومن المحتمل أن يكون معالجة قيمة وقت التشغيل لإحدى خصائص كائن معين إلى سلسلة للسَلسَلة كسمة.

يعرف TypeConverter أربعة أعضاء ذات صلة بالتحويل من والى سلاسل لأغراض معالجة XAML :

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

الأسلوب الأكثر أهمية التالي هو ConvertTo. إذا تم تحويل تطبيق الى تمثيل علامات (على سبيل المثال، إذا تم حفظه لـ XAML كملف) ، ConvertTo مسؤولةً عن إنتاج تمثيل العلامات. في هذه الحالة، مسار التعليمات البرمجية التي لها أهمية بالنسبة XAML هى عندما يتم تمرير destinationType الخاص بـ String.

CanConvertTo وCanConvertFrom هى أساليب مساعدة تُستخدم عندما تستعلم خدمة عن قدرات التطبيق TypeConverter. يجب تطبيق هذه الطرق لإرجاع true للحالات الخاصة من الأنواع التي يدعم المحول الخاص بك عمليات التحويل المكافئة لها. لأغراض XAML، هذا يعني عادة أن النوع String.

معلومات الثقافة ومحولات النوع لـ XAML

كل تطبيق TypeConverter يمكن أن يكون له التفسير الخاص به من ما يؤسس سلسلة صالحة لإجراء تحويل و يمكن أيضاً أن يستخدم أو يتجاهل الوصف الذى تم تمريره كمتغيرات. هناك أحد الاعتبارات الهامة بالنسبة لثقافة وتحويل نوع XAML. يتم اعتماد استخدام سلاسل قابلة للترجمة كقيم السمة معتمد تماماً من قبل XAML. ولكن باستخدام هذه السلسلة القابلة للترجمة كإدخال محول نوع مع متطلبات موروثة معينة غير معتمدة، لأن محولات النوع لقيم سمات XAML تتضمن بالضرورة سلوك محلل لغة ثابت باستخدام البيانات الموروثة من en-US. للحصول على مزيد من المعلومات حول أسباب التصميم بهذا التقييد يجب مراجعة مواصفات لغة XAML ( [MS-XAML]).

كمثال يمكن أن تكون البيانات الموروثة مشكلة، بعض الثقافات تستخدم فاصلة كـالعلامة العشرية الخاصة بهم كمحدد للأرقام. هذا سوف يتصادم مع سلوك أي محولات أنواع لـ XAML WPF التى تستخدم فاصلة كمحدد (استناداً إلى التوابع التاريخية مثل النوذج الشائع X ، Y أو فاصلة بفواصل القوائم). حتى تمرير بيانات موروثة في الـ XAML المحيط (إعداد البيانات Language أو xml:lang الى sl-SI هو مثال للبيانات الموروثة التى تستخدم فاصلة عشرية بهذه الطريقة) لم يحل المشكلة.

تطبيق ConvertFrom

لكى يكون قابل للاستخدام كـتطبيق TypeConverter الذى يدعم XAML ، [الأسلوبM:System.ComponentModel.TypeConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object)] لهذا المحول يجب أن يأخذ سلسلة كالمتغير value. إذا كانت السلسلة في تنسيق صالح ويمكن تحويلها باستخدام التطبيق TypeConverter، فتكون الكائنات التي يتم إرجاعها يجب أن يدعم التحويل إلى النوع المتوقع بواسطة الخاصية. بخلاف ذلك، يجب أن يرجع التطبيقConvertFrom القيمةnull.

كل تطبيق TypeConverter يمكن أن يكون له التفسير الخاص به من ما يؤسس سلسلة صالحة لإجراء تحويل و يمكن أيضاً أن يستخدم أو يتجاهل الوصف الذى تم تمريره كمتغيرات. ومع ذلك،قد لا تقوم معالجة XAML WPF بتمرير قيم الى سياق وصف النوع في كافة الحالات وقد أيضاً لا تقوم بتمرير البيانات الموروثة استناداً إلى xml:lang.

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

لا تستخدم الأحرف المتعرجة بشكل خاص {، كعنصر تنسيق للسلسلة الخاصة بك.يتم حفظ هذه الأحرف كـالإدخال والإنهاء لتسلسل ملحق علامات.

تطبيق ConvertTo

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

لكى تكون قابلة للاستخدام كـتطبيق TypeConverterالذى يعتمد XAML ، الأسلوب ConvertTo لهذا المحول يجب أن يقبل مثيل من هذا النوع (أو قيمة) يتم اعتماد أنها متغير value. عندما يكون المتغير destinationType هو النوع String ، اذن يجب أن يكون الكائن الذي يتم إرجاعه قابل للتحويل كـ String. يجب أن تمثل السلسلة التي تم إرجاعها قيمة متسلسلة لـ value. وبشكل مثالي، تنسيق التسلسل الذى قمت باختياره يجب أن يكون قادر على إنشاء نفس القيمة إذا تم تمرير هذه السلسلة إلى التطبيق ConvertFrom لنفس المحول دون فقد كبير من المعلومات.

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

إذا لم يكن المتغير destinationType من النوع String, يمكنك اختيار معالجة المحول الخاص بك. بشكل عام، سيكون عليك العودة الى معالجة التطبيق الأساسية والتى فى الأساس ConvertTo تقوم باجراء استثناء محدد.

تطبيق CanConvertTo

التطبيق CanConvertTo الخاص بك يجب أن يقوم بارجاع true الى destinationType من النوع String ، و وإلا يقوم بتأجيل التنفيذ الأساسي.

تطبيق CanConvertFrom

التطبيق CanConvertFrom الخاص بك يجب أن يقوم بارجاع true الى sourceType من النوع String ، و وإلا يقوم بتأجيل التنفيذ الأساسي.

تطبيق TypeConverterAttribute

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

يمكنك أيضاً توفير محول على أساس الخاصية. بدلاً من تطبيق سمة NET Framewor.TypeConverterAttribute إلى تعريف فئة قم بتطبيق التعريف الى خاصية (التعريف الرئيسي وليس تطبيقات getset الموجودة بداخله). يجب أن يتطابق نوع الخاصية النوع الذى تتم معالجته بواسطة محول النوع المخصص الخاص بك. مع وجود تطبيق هذه السمة عندما يقوم معالج XAML بمعالجة قيم تلك الخاصية فإنه يمكن معالجة سلاسل الإدخال وارجاع مثيلات الكائن. تقنية التحويل لكل خاصية تكون مفيدة خاصة إذا اخترت استخدام نوع خاصية من Microsoft NET Framewor. أو من مكتبة أخرى حيث يتعذر عليك التحكم فى تعريف الفئة و لا يمكن تطبيق TypeConverterAttribute هناك.

راجع أيضًا:

المرجع

TypeConverter

المبادئ

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

ملحقات ترميز و XAML WPF

بناء جملة XAML بالتفاصيل