سؤال

أقوم بإنشاء فصل يرث من System.Windows.Documents.Paragraph ويضيف خاصية مجموعة جديدة. فيما يلي تمثيل مبسط للغاية لتلك الفئة:

public class ExtendedParagraph : Paragraph
{
    public Dictionary<string, string> Attributes { get; set; }
}

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

نظرًا لأن فئة الفقرة مزينة بالسمات [ContentProperty("Inlines")], ، أفترض أنني بحاجة إلى ملء الخطوط وتجمعات السمات صراحة. استنادًا إلى بناء جملة XAML الذي رأيته في حل تحديات مماثلة في مكان آخر ، أتصور شيئًا كهذا:

<ExtendedParagraph xmlns="clr-namespace:MyNamespace">
    <ExtendedParagraph.Inlines>

        This is where the paragraph content goes

    </ExtendedParagraph.Inlines>
    <ExtendedParagraph.Attributes>

        This is where the members of the Attributes property are declared 

    </ExtendedParagraph.Attributes>
</ExtendedParagraph>

ومع ذلك ، يقدم هذا النهج مشكلتين:

1] عندما يتم تحليل XAML أعلاه باستخدام XamlReader ، فإنه يفشل في الرسالة "تم تعيين خاصية ExtendedParagraph.inlines بالفعل ويمكن تعيينها مرة واحدة فقط"

2] لست متأكدًا من العلامات التي يجب أن أستخدمها لإعلان مثيلات keyvaluepair ضمن عنصر السمات.

آمل أن يتمكن شخص ما من توجيهني في الاتجاه الصحيح.

شكرا جزيلا تيم

تحرير - لقد وجدت إجابة السؤال [1]. يستلزم ببساطة إعلان مجموعة السمات (باستخدام بناء جملة عنصر الخاصية) أولاً ، يليه محتوى الفقرة:

<ExtendedParagraph xmlns="clr-namespace:MyNamespace">
    <ExtendedParagraph.Attributes>

        This is where the members of the Attributes property are declared 

    </ExtendedParagraph.Attributes>
    This is where the paragraph content goes
</ExtendedParagraph>

ومع ذلك ، فإن إضافة أعضاء إلى أ Dictionary<TKey, TValue> يثبت أكثر صعوبة. لقد وجدت بعض القرائن في هذا المشنور, ، لكنني لم أحقق بعد نتيجة عمل. أفكارك لا تزال موضع ترحيب.

هل كانت مفيدة؟

المحلول

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

على ما يبدو ، فإن دعم الأدوية الجيرية في XAML محدود ، مما يعني أنه لا يوجد آلة XAML الأصلية لملء أ Dictionary<TKey, TValue> (أو أي فئة تجميع عامة أخرى).

ولكن كما هذه المقالة يصف ، من الممكن إنشاء فئة ملحق مخصصة ، وبمجرد تكوينها لتناسب نوع عضو المجموعة ، ستقوم بنجاح بملء خاصية المجموعة بشكل تعريفي:

<ExtendedParagraph.Attributes>
    <generic:DictionaryOfT TypeArgument="sys:String">
        <generic:DictionaryOfT.Items>
            <sys:String x:Key="String1">Hello</sys:String>
            <sys:String x:Key="String2">World</sys:String>
        </generic:DictionaryOfT.Items>
    </generic:DictionaryOfT>
</ExtendedParagraph.Attributes>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top