在控件库中拆分 Generic.xaml

Splitting Generic.xaml up in Control Library

我的 Generic.xaml 开始变得相当大,我正在寻找拆分它的方法。

我尝试的第一件事对我来说是最明显的:使用 ResourceDictionary.Merge 来完成技巧。 但是,执行此操作时,不会应用那些 XAML 文件中设置的样式。

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:SimplifySoft.Controls">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/MyAssembly;component/Path/Control1.xaml"/>
        <ResourceDictionary Source="pack://application:,,,/MyAssembly;component/Path/Control2.xaml"/>
        <ResourceDictionary Source="pack://application:,,,/MyAssembly;component/Path/Control3.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

当然,我首先想到的是我在这些配置中的错误。 为了确认是否是,我将文件更改为如下内容:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:SimplifySoft.Controls">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary>
            <SolidColorBrush x:Key="MySolidColorBrushKey" Color="Red" />
        </ResourceDictionary>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

因为这两个都不行,我现在在这里问:

如何正确拆分 generic.xaml 文件

请注意,仅使用普通的 ResourceDictionary 就可以正常工作并且符合预期,但是由于文件的大小,我开始在编辑默认样式时遇到问题。

另请注意,Source 参数中引用的文件具有构建操作 Resource 并且是 ResourceDictionaries 本身。 Generic.xaml 具有构建操作 Page

感谢您的宝贵时间:)

我正在做你想做的事情,而且从来没有遇到过问题。因此,作为快速测试,我将 ResourceDictionaries 之一的 Build Action 更改为 Resource,rebuilt 项目(只是构建没有' t do it),得到一个XamlParseException——默认样式在ResourceDictionary的控件无法初始化。

那么,当您将 构建操作 从页面更改为资源时,会发生什么变化?

In Visual Studio, when you add a new Window, NavigationWindow, Page, FlowDocument, or ResourceDictionary to a project, the Build Action for the markup file will default to Page.

When a project with Page items is compiled, the XAML items are converted to binary format and compiled into the associated assembly. Consequently, these files can be used in the same way as typical resource files.

Note: If a XAML file is configured as a Resource item, and does not have a code-behind file, the raw XAML is compiled into an assembly rather than a binary version of the raw XAML.

有关 Microsoft docs 上资源文件的更多详细信息。

假设您的 Source 路径是正确的(我将我的保存在 Themes 文件夹中,所以我有 Themes 而您有 Path),并且(如果您从标准控件派生)您的自定义控件具有带有 DefaultStyleKeyProperty.OverrideMetadata 的静态构造函数,您只需要将 Build Action 还原为 Page.

注意:第二个代码示例无法工作,因为主题不是皮肤。 Generic.xaml 基本上用于为自定义控件提供默认样式(更多信息请参见 this SO question)。