我第一次涉足 WPF 自定义控件库池。我在一个单独的解决方案中为我的自定义控件创建了一个项目,该控件只是从 Control 派生的。
在我想使用自定义控件的目标应用程序中,它可以工作,但似乎无法访问默认样式,除非我在 App.xaml 文件中专门添加了引用。我添加了 xmlns 属性,因此控件本身可用。我希望我错过了一些使控件更加独立的设置。因此,在我的目标 WPF 应用程序中,如果我在 App.xaml 中添加注释后显示的行,一切正常(功能和样式):
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MyStandardStuff.xaml" />
<!-- How do I avoid having everyone who uses the control having to add the following line?-->
<ResourceDictionary Source="/MyNewControl;component/Themes/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
鉴于我的自定义控件库有一个 Themes 文件夹,其中包含一个包含此表单样式的 Generic.xaml 文件:
<Style TargetType="{x:Type local:MyNewControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyNewControl}">
...
有没有办法让它工作而不在 App.xaml 中添加显式引用?
编辑
这是随项目创建的 ThemeInfo 属性。
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
答案的细节
我不确定这个问题会再次出现,因为事实证明我做了一些愚蠢的事情,但万一发生了……我使用 VS 模板创建了 WPF 自定义控件库。然后我将我的控件类复制并粘贴到 Visual Studio 创建的默认类上。我没有注意到的是 VS 创建了一个静态构造函数,它正在做一些非常重要的事情。在对以下答案的评论中指出了这一点。静态构造函数应该是这样的
static MyNewControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyNewControl),
new FrameworkPropertyMetadata(typeof(MyNewControl)));
}
Once this was in place I could remove the code I added to the target's resource dictionary.