在UWP中嵌套ResourceDictionaries和MergedDictionaris
本文关键字:MergedDictionaris ResourceDictionaries 嵌套 UWP | 更新日期: 2023-09-27 17:57:55
我正试图在当前的UWP应用程序中拆分一个包含多个控件样式的ResourceDictionary
。该文件已经增长到大约3000行,管理起来简直是人间地狱,所以我决定将其拆分为更小、更具体的ResourceDictionaries
,并使用MergedDictionaries
将其包含在内。
App.xaml
<common:BootStrapper x:Class="Asteria.Ion.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:common="using:Template10.Common"
xmlns:styles="using:Asteria.Ion.Styles"
RequestedTheme="Dark">
<common:BootStrapper.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles'Custom.xaml" />
<ResourceDictionary Source="Styles'CustomControls.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</common:BootStrapper.Resources>
</common:BootStrapper>
CustomControls.xaml
包含对其他ResourceDictionaries
的引用。
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:Template10.Controls"
xmlns:behaviors="using:Template10.Behaviors"
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:local="using:Asteria.Ion.Styles">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Shared.xaml" />
<ResourceDictionary Source="Templates.xaml" />
<ResourceDictionary Source="ComponentBlock.xaml" />
<ResourceDictionary Source="FlowAgent.xaml" />
<ResourceDictionary Source="Planning.xaml" />
<ResourceDictionary Source="ProjectDialog.xaml" />
<ResourceDictionary Source="Inspector.xaml" /-->
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
这将始终产生以下异常:Failed to assign to property 'Windows.UI.Xaml.ResourceDictionary.Source' because the type 'Windows.Foundation.String' cannot be assigned to the type 'Windows.Foundation.Uri'. [Line: 12 Position: 37]
我已经尝试过多次更改源URI,但它一直给出这个错误。仅注释掉CustomControls.xaml
中的所有ResourceDictionary
元素会有所帮助。当然,我也会遇到一些缺失风格的例外情况。
我尝试过的一些URI格式:
/Styles/Shared.xaml
Styles/Shared.xaml
Styles'Shared.xaml
.'Shared.xaml
ms-appx:///Styles/Shared.xaml
它们都不起作用。
如有任何建议,我们将不胜感激。
最终它与URI结构无关,而是与ThemeDictionaries
和MergedDictionaries
的组合有关。
以前的工作原理:
在App.Resources
:中
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles/Themes.xaml" />
<ResourceDictionary Source="Styles/CustomControls.xaml" />
</ResourceDictionary.MergedDictionaries>
其中Themes.xaml
包含ThemeDictionaries
,CustomControls.xaml
包含<Styles>
(很多)。
拆分CustomControls.xaml
后,它不再包含任何样式,而只包含MergedDictionaries
。看起来像这样:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ControlStyles/ProjectDialog.xaml" />
<ResourceDictionary Source="ControlStyles/Inspector.xaml" />
</ResourceDictionary.MergedDictionaries>
Inspector.xaml
包含一个使用{ThemeResource}
的Style
,这似乎就是它出错的地方。最终的解决方案/解决方案是在Inspector.xaml
中包含一个引用了Themes.xaml
的MergedDictionaries
。
现在,如果有人能解释这个解决方案背后的确切原因,我将不胜感激。
从错误消息中,XAML编译器无法转换嵌套ResourceDictionary的Source属性。最简单、最快的解决方法是在App.Xaml.cs
:中添加嵌套的ResourceDictionaries
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
...
var applicationMergedDics = Application.Current.Resources.MergedDictionaries;
applicationMergedDics[0].MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("ms-appx:///Styles/Shared.xaml") });
applicationMergedDics[0].MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("ms-appx:///Styles/Templates.xaml") });
...
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
注意:不要忘记删除CustomControls.xaml
中的MergedDictionaries
。错误就会消失。