我有一个自定义的控件库,在那里我有我的主要应用程序中使用几个自定义控件。我有一个简单的自定义控制,其从组合框允许用户选择笔的厚度值。现在,我创建一个新的自定义控制,基于一个列表框,我想包括在新的自定义控制的ItemTemplate笔厚度组合框。

我正在此错误:

<强>“无法创建的实例‘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和代码隐藏我的新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 只应的静态构造内进行的,其提供自身作为该方法的forType参数,或通过类似实例的类型。试图改变元数据中的所有者类型存在不会产生异常的情况下之后,但会导致在属性系统不一致的行为。

这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