سؤال

يبدو أن UserControl العادي مثل هذا في XAML:

<UserControl x:Class="mynamespace.foo" ...namespaces...>
<!-- content -->
</UserControl>

أود أن أكون قادرًا على تحديد كائن المستوى الأعلى الخاص بي ، على غرار:

<MyControl x:Class="mynamespace.mycontrol" ...namespaces...>
<!-- content -->
</UserControl>

حيث يستمد MyControl من UserControl نفسه.

بالطبع يشكو المترجم من عدم العثور على "MyControl". هل هناك طريقة للتغلب على ذلك؟

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

المحلول

علامة الجذر هي الفئة الأساسية. هذا هو السبب في أن جذر النافذة الافتراضية 1 هو نافذة. استخدام خيار القائمة إضافة> USERCONTOL ... هو في الواقع إنشاء فئة فرعية لـ USERCONTOL.

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

حدد أولاً صفك الأساسي:

public class MyControlBase : UserControl
{
    // ...
}

ثم قم بإنشاء فئة الطفل المحددة:

(يمكنك البدء مع UserControl1 الذي تم إنشاؤه تلقائيًا وتغييره من هناك)

public partial class MyControl1 : MyControlBase
{
    public MyControl1()
    {
        InitializeComponent();
    }
}

ثم قم بتغيير جانب XAML لتبدو هكذا:

<MyNamespace:MyControlBase
    x:Class="MyNamespace.MyControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:MyNamespace="clr-namespace:MyNamespace">

هذه طريقة رائعة لجعل عناصر تحكم مخصصة مستمدة من بنيت في تلك التي usercontrol. يُنصح عادةً فقط باستخدام UserConrtols الأساسية إذا كنت تستطيع وتحكم مخصص فقط إذا كان عليك ذلك.

حظا سعيدا،

نصائح أخرى

حدد مساحة الاسم في XAML ثم استخدم اسم التحكم الخاص بك كعلامة:

<Window ...
    xmlns:my="..." />

    <my:mycontrol ... />

</Window>

لا. يعلن XAML ماهية MyControl بصريًا ، تمامًا كما تحدد الكود-Behind ما هو mycontrol السلوكي. إن تحديد صور myControl من حيث myControl لن يكون له معنى حقًا: إنه ما يعادل ، في الكود ، اشتقاق myControl من MyControl ، والتي من الواضح أنك لن تفعل.

بالإضافة إلى ذلك ، لا يتيح لك WPF استخلاص فئة USERCONTROL من أخرى على سبيل المثال إذا كان bobscontrol هو USERCONTROL ثم لا يمكنك الكتابة <local:BobsControl x:Class="MyNamespace.MyControl... /> أيضاً. أعتقد أن هذا لأن UserControls لها مظهر مرئي (محتوى) مخبوز في XAML الخاص بهم وأن محتوى الفئة المشتقة يجب أن يحل محل محتوى الفئة الأساسية ، وبالتالي فإن الميراث البصري غير مفيد عمومًا.

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

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