UWP/XAML:页面中的主题与#x27;是在单独的ResourceDictionary文件中还是在App.xaml中?

UWP/XAML:页面中的主题与#x27;是在单独的ResourceDictionary文件中还是在App.xaml中?,xaml,uwp,uwp-xaml,Xaml,Uwp,Uwp Xaml,我有一个简单的UWP应用程序,只有一个页面。在尝试覆盖SystemAccentColor时(请参阅其他问题,如),我发现在添加代码的3个有效位置中的每个位置都会得到不同的结果: 在页面本身的参考资料部分。(什么也不做) 在单独的ResourceDictionary文件中。(仅部分工作) 在App.xaml文件中。(工程) 这是一个页面。我的单个页面的参考资料以及Dictionary.xaml中包含的自定义样式: <Page.Resources> <ResourceDic

我有一个简单的UWP应用程序,只有一个页面。在尝试覆盖SystemAccentColor时(请参阅其他问题,如),我发现在添加代码的3个有效位置中的每个位置都会得到不同的结果:

  • 在页面本身的参考资料部分。(什么也不做)

  • 在单独的ResourceDictionary文件中。(仅部分工作)

  • 在App.xaml文件中。(工程)

  • 这是一个页面。我的单个页面的参考资料以及Dictionary.xaml中包含的自定义样式:

    <Page.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Page.Resources>
    
    
    
    下面是我在3个位置中插入的SystemAccentColor代码,以下称为//代码//:

    <Color x:Key="SystemAccentColor">Red</Color>
    
    <SolidColorBrush x:Key="SystemControlBackgroundAccentBrush" Color="{ThemeResource SystemAccentColor}" />
    <SolidColorBrush x:Key="SystemControlDisabledAccentBrush" Color="{ThemeResource SystemAccentColor}" />
    <SolidColorBrush x:Key="SystemControlForegroundAccentBrush" Color="{ThemeResource SystemAccentColor}" />
    <SolidColorBrush x:Key="SystemControlHighlightAccentBrush" Color="{ThemeResource SystemAccentColor}" />
    <SolidColorBrush x:Key="SystemControlHighlightAltAccentBrush" Color="{ThemeResource SystemAccentColor}" />
    <SolidColorBrush x:Key="SystemControlHighlightAltListAccentHighBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.9" />
    <SolidColorBrush x:Key="SystemControlHighlightAltListAccentLowBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.6" />
    <SolidColorBrush x:Key="SystemControlHighlightAltListAccentMediumBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.8" />
    <SolidColorBrush x:Key="SystemControlHighlightListAccentHighBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.9" />
    <SolidColorBrush x:Key="SystemControlHighlightListAccentLowBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.6" />
    <SolidColorBrush x:Key="SystemControlHighlightListAccentMediumBrush" Color="{ThemeResource SystemAccentColor}" Opacity="0.8" />
    <SolidColorBrush x:Key="SystemControlHyperlinkTextBrush" Color="{ThemeResource SystemAccentColor}" />
    <SolidColorBrush x:Key="ContentDialogBorderThemeBrush" Color="{ThemeResource SystemAccentColor}" />
    <SolidColorBrush x:Key="JumpListDefaultEnabledBackground" Color="{ThemeResource SystemAccentColor}" />
    
    红色
    
    第页的参考资料部分 将//代码//插入页面中。资源不起任何作用

    <ResourceDictionary>
    
        <ResourceDictionary.ThemeDictionaries>
            //THE CODE//
        </ResourceDictionary.ThemeDictionaries>
    
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    
    </ResourceDictionary>
    
    <ResourceDictionary>
    
        <ResourceDictionary.ThemeDictionaries>
            <ResourceDictionary x:Key="Light">
                //THE CODE//
            </ResourceDictionary>
        </ResourceDictionary.ThemeDictionaries>
    
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    
    </ResourceDictionary>
    
    <ResourceDictionary.ThemeDictionaries>
        //THE CODE//
    </ResourceDictionary.ThemeDictionaries>
    
    
    //代码//
    
    指定这应该应用于灯光主题也不会起任何作用

    <ResourceDictionary>
    
        <ResourceDictionary.ThemeDictionaries>
            //THE CODE//
        </ResourceDictionary.ThemeDictionaries>
    
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    
    </ResourceDictionary>
    
    <ResourceDictionary>
    
        <ResourceDictionary.ThemeDictionaries>
            <ResourceDictionary x:Key="Light">
                //THE CODE//
            </ResourceDictionary>
        </ResourceDictionary.ThemeDictionaries>
    
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    
    </ResourceDictionary>
    
    <ResourceDictionary.ThemeDictionaries>
        //THE CODE//
    </ResourceDictionary.ThemeDictionaries>
    
    
    //代码//
    
    字典资源 将//代码//插入Dictionary.xaml也不会起任何作用

    <ResourceDictionary>
    
        <ResourceDictionary.ThemeDictionaries>
            //THE CODE//
        </ResourceDictionary.ThemeDictionaries>
    
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    
    </ResourceDictionary>
    
    <ResourceDictionary>
    
        <ResourceDictionary.ThemeDictionaries>
            <ResourceDictionary x:Key="Light">
                //THE CODE//
            </ResourceDictionary>
        </ResourceDictionary.ThemeDictionaries>
    
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    
    </ResourceDictionary>
    
    <ResourceDictionary.ThemeDictionaries>
        //THE CODE//
    </ResourceDictionary.ThemeDictionaries>
    
    
    //代码//
    
    但是,指定“亮/暗”主题会导致颜色覆盖应用,但仅适用于我的自定义样式,这些样式也在Dictionary.xaml中定义。但是,它仅适用于Windows亮/暗主题匹配的情况

    <ResourceDictionary.ThemeDictionaries>
        <ResourceDictionary x:Key="Light">
            //THE CODE//
        </ResourceDictionary>
    </ResourceDictionary.ThemeDictionaries>
    
    
    //代码//
    
    App.xaml 在App.xaml中插入//代码//就行了

    <Application.Resources>
        <ResourceDictionary>
            //THE CODE//
        </ResourceDictionary>
    </Application.Resources>
    
    
    //代码//
    
    编辑:我还可以将暗/光主题指定为x:Key,一切正常

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.ThemeDictionaries>
                <ResourceDictionary x:Key="Light">
                    //THE CODE//
            </ResourceDictionary.ThemeDiciontaries>
        </ResourceDictionary>
    </Application.Resources>
    
    
    //代码//
    
    收尾
    总之,这到底是怎么回事?这显然是某种范围问题,但是,我在开发人员文档中找不到任何解释我在这里看到的行为的东西。

    很多工具不起作用的原因是
    ResourceDictionary。主题词典
    希望它的内容是资源词典,其中的键对应于各个项目。如果您将常规资源(如主题画笔)放入其中,则主题资源查找不知道该做什么,因此它不会拾取资源

    如果在主题词典中指定资源,并加载包含该资源的词典,则资源词典将覆盖主题资源词典值,因此混合主题词典并在合并词典中加载资源词典通常是个坏主意

    如果您仅在主题词典“light”中指定一个资源,则当apps/pages词典处于light主题中时,资源查找将获取该资源。但是,如果页面处于暗主题中,它将查找“暗”字典(在您的情况下,它丢失了该字典),然后向上搜索树,直到找到一个具有指定资源的暗主题字典。因此,要在所有主题中覆盖该资源,需要在所有主题字典(浅、暗和默认)中指定该资源