自定义控件设置其 DefaultStyleKey 时的 XamlParseException
本文关键字:时的 XamlParseException DefaultStyleKey 设置 自定义控件 | 更新日期: 2023-09-27 17:56:14
我正在研究一个直接从Control
派生的自定义 WPF 控件。 在控件的构造函数中,我按如下方式设置DefaultStyleKey
:
public MyControl()
{
DefaultStyleKey = typeof(MyControl);
}
我在名为 MyControl.xaml
的ResourceDictionary
中定义了控件的样式:
<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>
当我运行应用程序时,我收到一个XamlParseException
,其中包含消息"'MyControl'的初始化引发异常。 最里面的异常是"无法定位资源'button.xaml'"。 如果我从 MyControl
的构造函数中删除 DefaultStyleKey = typeof(MyControl)
行,我在运行应用程序时没有问题(尽管控件不可见,因为它没有设置模板)。
我是否错误地指定了控件的默认样式? 为什么异常似乎是从主ResourceDictionary
的不相关部分(Button.xaml
的导入)抛出的?
使用 WPF 时,您可以使用以下 ctor
static MyControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl),
new FrameworkPropertyMetadata(typeof(MyControl)));
}
如果这是在类库中,则需要在项目的"主题"文件夹中定义"Generic.xaml"文件。否则,可以在 App.xaml 中定义主题样式(MyControl 样式)