在控制库中拆分Generic.xaml

时间:2017-12-10 00:19:18

标签: c# wpf xaml resourcedictionary

我的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并且自身为ResourceDictionariesGeneric.xaml具有构建操作Page

感谢您的时间:)

1 个答案:

答案 0 :(得分:1)

我正在做你想做的事情,从来没有遇到过这个问题。所以作为一个快速测试,我在ResourceDictionaries之一上更改了 Build Action 到资源,重建项目(简单地构建没有做到) ,得到一个XamlParseException - 默认样式位于ResourceDictionary的控件无法初始化。

那么当您将 Build Action 从Page更改为Resource时会发生什么变化?

  

在Visual Studio中,当您向项目添加新的Window,NavigationWindow,Page,FlowDocument或ResourceDictionary时,标记文件的构建操作将默认为Page。

     

编译包含页面项目的项目时,XAML项目将转换为二进制格式并编译到关联的程序集中。因此,这些文件的使用方式与典型的资源文件相同。

     

注意:如果将XAML文件配置为Resource项,并且没有代码隐藏文件,则将原始XAML编译为程序集而不是原始XAML的二进制版本。

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

假设您的Source路径是正确的(我将其保存在Themes文件夹中,因此我有主题,其中路径),并且(如果您派生的话)从标准控件)您的自定义控件的静态构造函数为DefaultStyleKeyProperty.OverrideMetadata,您只需将构建操作还原为Page。

注意:第二个代码示例无法正常工作,因为主题不是蒙皮。 Generic.xaml主要用于为自定义控件提供默认样式(在this SO question中更多关于它)。