0

我第一次涉足 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.

4

1 回答 1

3

I would make sure that the xaml file in your control assembly is marked as Page and also make sure that you have the ThemeInfo attribute in the assemblyinfo.cs for your control assembly.

于 2012-06-12T01:26:38.897 回答