كيفية الوراثة بشكل صحيح من عنصر تحكم المستخدم المحدد في XAML في Silverlight

StackOverflow https://stackoverflow.com/questions/225878

سؤال

إذا كان لدي عنصر تحكم مستخدم (في Silverlight) قمت بكتابته، ويستخدم XAML لتحديد مظهره، فكيف يمكنني إنشاء نسخة مخصصة منه؟

أي.لدي MyControl.xaml وMyControl.xaml.cs

ماذا يجب أن أفعل إذا كنت أرغب في الحصول على فئة فرعية "SpecialisedControl"؟أفترض أنني قمت بإنشاء ملف تعليمات برمجية جديد، ثم ورثته من MyControl.ولكن ماذا لو أردت تغيير مظهر الفئة الأساسية - فماذا أفعل؟

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

المحلول

لقد كتبت هذا معتقدًا أنك تتحدث عن WPF، بدلاً من Silverlight، ولكن قد يكون هناك تداخل كافٍ ليكون هذا مفيدًا، لذلك أقوم بنشره على أي حال.

إذا كنت تعني "تغيير مظهر الفئة الأساسية" "توفير قالب جديد"، فمن المحتمل أن يكون ما تحتاجه هو CustomControl، وليس UserControl.

أفضل طريقة لتحقيق ذلك هي اتباع المثال الذي حددته عناصر تحكم Microsoft الأخرى، مثل Button أو ListBox:

  1. قم بإنشاء فئة مشتقة مباشرة من عنصر التحكم (أو أي شيء أقرب إلى عنصر التحكم الخاص بك).
  2. إذا كانت هناك حاجة إلى عرض أي خصائص لعنصر التحكم (مثل النص الموجود على زر، على سبيل المثال)، فتأكد من تعريفها بشكل صحيح على أنها DependencyProperties.
  3. كما وصفت هنا, ، قم بإنشاء ResourceDictionary يسمى Themes/generic.xaml وأضف نمطًا لفصلك يتضمن قالبًا (لا تعطي النمط مفتاحًا).
  4. استخدم TemplateBindings لأي خصائص للعناصر الموجودة في عنصر التحكم الخاص بك والتي تحتاج إلى الحصول على قيم من عنصر التحكم الخاص بك.
  5. إذا كنت ستحتاج إلى إرفاق أي معالجات أحداث بالعناصر الموجودة في القالب الخاص بك، فامنحها اسمًا فريدًا.تستخدم Microsoft تقليد وضع بادئة لهذه الأسماء بـ "PART_"، وأعتقد أنه من الجيد القيام به من أجل الاتساق، ولكنه ليس مطلوبًا بشكل صارم.
  6. مرة أخرى، إذا كنت بحاجة إلى إرفاق معالجات الأحداث، فقم بتحميل OnApplyTemplate() بشكل زائد.في هذه الطريقة، يجب عليك فصل أي معالجات أحداث قديمة (نحن بالتأكيد لا نريد أي تسرب للذاكرة!) .

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

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

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

نصائح أخرى

وأنا دونو، أنا أحب عمل الأشياء مع الأشياء عادي فقط. وهنا مقال يصف طريقة سهلة لتنزلق تحكم مصممة XAML خارج التسلسل الهرمي الميراث الخاص بك بحيث يمكنك تخصيص مظهر وسلوك باستخدام SimpleThingsLikeInheritance بدلا من MicrosoftStuffThatAlmostWorks

HTTP : //gen5.info/q/2009/02/10/subverting-xaml-how-to-inherit-from-silverlight-user-controls/

وكما يصف صلة مينيا، والحل الأسهل هو مجرد إضافة مساحة في XAML الخاص بك:

تحليل C #

public class MyBase : UserControl
{
}

public class FirstUserControl : MyBase
{
...
}

XAML

<local:MyBase 
    x:Class="FirstUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local="YourAssembly" ...>

    <!-- Sticking with UserControl instead of local:MyBase makes this clearer -->
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                ..
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>

..Your XAML
</local:MyBase>

ويمكنك حل هذه باستخدام المجمع كما هو موضح في الرابط أعلاه. ولكن يمكنك أيضا استخدام نمط استراتيجية لحل هذه المشكلة.

في هذا المنصب وشرح كيفية تطبيق هاتين الطريقتين. http://www.lab101.be/2008/07/silverlight-usercontrol -inheritance /

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top