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

本文关键字:时的 XamlParseException DefaultStyleKey 设置 自定义控件 | 更新日期: 2023-09-27 17:56:14

我正在研究一个直接从Control派生的自定义 WPF 控件。 在控件的构造函数中,我按如下方式设置DefaultStyleKey

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

我在名为 MyControl.xamlResourceDictionary中定义了控件的样式:

<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的导入)抛出的?

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

使用 WPF 时,您可以使用以下 ctor

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

如果这是在类库中,则需要在项目的"主题"文件夹中定义"Generic.xaml"文件。否则,可以在 App.xaml 中定义主题样式(MyControl 样式)