سؤال

لدي مكتبة تحكم مخصصة حيث لدي العديد من عناصر التحكم المخصصة التي أستخدمها في طلبي الرئيسي. لديّ عنصر تحكم مخصص بسيط يتيح للمستخدم تحديد قيم سماكة القلم من combobox. الآن ، أقوم بإنشاء عنصر تحكم مخصص جديد ، استنادًا إلى صندوق القائمة ، وأريد تضمين سماكة القلم combobox في itemtemplate الجديد الخاص بـ Custom Control.

سأتعامل مع هذا الخطأ:

"لا يمكن إنشاء مثيل" linethicknesscombobox "المحددة في التجميع customControls ... تم إلقاء استثناء بواسطة هدف الاحتجاج. خطأ في الكائن" 10_t "في ملف العلامات" customControls ؛ مكون/سمات/customlistbox.general.xaml '.

هنا هو XAML والرمز وراء linethicknesscombobox:

namespace CustomControls
{
    public class LineThicknessComboBox : ComboBox
    {
        public LineThicknessComboBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(LineThicknessComboBox)
                        , new FrameworkPropertyMetadata(typeof(LineThicknessComboBox)));

        }
    }
}

وفي linethicknesscombobox.generic.xaml:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomControls">

<Style TargetType="{x:Type local:LineThicknessComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                ...
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

</ResourceDictionary>

فيما يلي XAML و CodeBehind لـ CustomListbox الجديد:

namespace CustomControls
{
    public class CustomListBox : ListBox
    {
        public CustomListBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomListBox)
                        , new FrameworkPropertyMetadata(typeof(CustomListBox)));
        }
    }
}

وفي CustomListbox.generic.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomControls">

<Style TargetType="{x:Type local:CustomListBox}" BasedOn="{StaticResource {x:Type ListBox}}">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Border>
                 ...
                     <local:LineThicknessComboBox />
                 ...  
                </Border>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

</ResourceDictionary>

وهنا هو generix.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="CustomControls;component/Themes/LineThicknessComboBox.Generic.xaml"/>
        <ResourceDictionary Source="CustomControls;component/Themes/CustomListBox.Generic.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

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

هل يمكن لأي شخص أن يشرح لماذا أحصل على هذا الخطأ؟ من الممكن تضمين تحكم مخصص في آخر ، على الرغم من أنها في نفس مكتبة التحكم المخصصة ، صحيحة؟

شكرًا!

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

المحلول

// أعتقد أنه يجب أن يكون مُنشئًا ثابتًا في كلتا الحالتين لأن بيانات بيانات الممتلكات التبعية يجب أن تتم دائمًا في مُنشئ ثابت.

// not public LineThicknessComboBox()
static LineThicknessComboBox()        
{
            DefaultStyleKeyProperty.OverrideMetadata(
               typeof(LineThicknessComboBox)
                        , new FrameworkPropertyMetadata(
                              typeof(LineThicknessComboBox)));
}

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

من MSDN

نصائح أخرى

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

يتمثل الحل في استخدام System.componentModel.DesignerProperties فئة للتحقق مما إذا كنت في وضع التصميم ، ولف أي رمز لا يعمل في وضع التصميم في كتلة إذا منعته من التشغيل:

namespace CustomControls
{
    public class LineThicknessComboBox : ComboBox
    {
        public LineThicknessComboBox()
        {
            // Design-mode capable code...

            if (DesignerProperties.GetIsInDesignMode(this)) return;

            // Design mode incapable code...

            DefaultStyleKeyProperty.OverrideMetadata(typeof(LineThicknessComboBox)
                        , new FrameworkPropertyMetadata(typeof(LineThicknessComboBox)));

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