在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

它们都不起作用。

如有任何建议,我们将不胜感激。

在UWP中嵌套ResourceDictionaries和MergedDictionaris

最终它与URI结构无关,而是与ThemeDictionariesMergedDictionaries的组合有关。

以前的工作原理:

App.Resources:中

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Styles/Themes.xaml" />
    <ResourceDictionary Source="Styles/CustomControls.xaml" />
</ResourceDictionary.MergedDictionaries>

其中Themes.xaml包含ThemeDictionariesCustomControls.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.xamlMergedDictionaries

现在,如果有人能解释这个解决方案背后的确切原因,我将不胜感激。

从错误消息中,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。错误就会消失。

相关文章:
  • 没有找到相关文章