让WPF自定义控件库控制以显示正确样式的正确方法是什么?

时间:2012-06-12 00:52:50

标签: wpf xaml custom-controls

我第一次在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)));
    }

一旦这个到位,我可以删除我添加到目标资源字典中的代码。

1 个答案:

答案 0 :(得分:3)

我会确保控件程序集中的xaml文件标记为Page,并确保控件程序集的assemblyinfo.cs中有ThemeInfo属性。