我试图在当前的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,但它一直存在此错误。只有注释掉ResourceDictionary中的所有CustomControls.xaml元素才有帮助。当然,我也有一些关于风格缺失的例外。
我尝试过的一些URI格式:
/Styles/Shared.xamlStyles/Shared.xamlStyles\Shared.xaml.\Shared.xamlms-appx:///Styles/Shared.xaml他们都不管用。
如有任何建议,将不胜感激。
发布于 2016-07-22 08:58:30
最后,它与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,这似乎就是它出错的地方。最终的解决方案/解决方案是包含一个MergedDictionaries,并在Inspector.xaml中引用Themes.xaml。
如果有人能解释这个解决方案背后的确切理由,我将不胜感激。
发布于 2016-07-22 08:42:29
从错误消息中,XAML编译器无法翻译嵌套ResourceDictionaries的Source属性。最简单和最快的解决方法是在App.Xaml.cs中添加嵌套的App.Xaml.cs。
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);
}注意:不要忘记删除MergedDictionaries中的CustomControls.xaml。错误就会消失。
https://stackoverflow.com/questions/38498611
复制相似问题