自定义控件设置其DefaultStyleKey时的XamlParseException

时间:2014-04-01 19:30:19

标签: c# wpf xaml wpf-controls custom-controls

我正在处理直接从Control派生的自定义WPF控件。在我的控件构造函数中,我设置了DefaultStyleKey,如此:

public MyControl()
{
    DefaultStyleKey = typeof(MyControl);
}

我在名为ResourceDictionary的{​​{1}}中定义了控件的样式:

MyControl.xaml

我从我的主<ResourceDictionary> <Style TargetType="{x:Type controls:MyControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate> ... </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary> 链接到此ResourceDictionary

ResourceDictionary

当我运行该应用程序时,我收到一条<ResourceDictionary> <ResourceDictionary.MergedDictionaries> <!-- set some application-wide styles for various controls --> <ResourceDictionary Source="Button.xaml"/> <ResourceDictionary Source="TextBox.xaml"/> <ResourceDictionary Source="ProgressBar.xaml"/> ... <ResourceDictionary Source="MyControl.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> ,其中包含消息&#34; 初始化&#39; MyControl&#39;抛出异常。&#34;最内部的例外是&#34; 无法定位资源&#39; button.xaml&#39; &#34;。如果我从XamlParseException的构造函数中删除DefaultStyleKey = typeof(MyControl)行,则运行应用程序时没有问题(尽管控件不可见,因为它没有设置模板)。

我是否错误地指定了我的控件的默认样式?为什么异常似乎是从主MyControl(导入ResourceDictionary)的无关部分抛出的?

1 个答案:

答案 0 :(得分:0)

使用WPF您使用以下ctor

static MyControl()
{
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl),
            new FrameworkPropertyMetadata(typeof(MyControl)));
}

如果这是在类库中,则需要在项目的“Themes”文件夹中定义“Generic.xaml”文件。否则,可以在App.xaml

中定义主题样式(MyControl样式)