我第一次在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)));
}
一旦这个到位,我可以删除我添加到目标资源字典中的代码。