WPF:使用另一个自定义控件的ItemTemplate中的自定义控制误差
-
22-09-2019 - |
题
我有一个自定义的控件库,在那里我有我的主要应用程序中使用几个自定义控件。我有一个简单的自定义控制,其从组合框允许用户选择笔的厚度值。现在,我创建一个新的自定义控制,基于一个列表框,我想包括在新的自定义控制的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)));
}
}
}