我的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
感谢您的时间:)
答案 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中更多关于它)。