MergedDictionaries索引超出了wpf app.xaml的范围

时间:2019-02-08 16:36:27

标签: c# wpf xaml resourcedictionary mergeddictionaries

背景:
我试图使我的WPF表单配色方案与Windows配色方案匹配 为此,我发现了一种包含预运行主题定义的方法,这意味着我需要更改MergedDictionaries[0].source
here

所述

这是我的Application.Resources,您可以看到这表明来源是“ Themes / light.xaml”
'Themes'内部,我创建了2个主题管理器:'Light.xaml''Dark.xaml'

<Application.Resources>

    <ResourceDictionary>

        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Themes/Light.xaml" />
        </ResourceDictionary.MergedDictionaries>

    </ResourceDictionary>

</Application.Resources>

如果我使用的是Windows Dark主题,我也希望更改UI 这就是我的方法:

WindowsTheme initialTheme = GetWindowsTheme();

this.Resources.MergedDictionaries[0].Source = new Uri($"Themes/{initialTheme}.xaml", UriKind.Relative);

(请注意,'WindowsTheme''GetWindowsTheme'是枚举和函数)


现在是问题所在:

每次尝试运行程序时,都会引发此异常:

  

抛出异常:mscorlib.dll中的'System.ArgumentOutOfRangeException'   mscorlib.dll中发生类型为'System.ArgumentOutOfRangeException'的未处理异常   索引超出范围。必须为非负数,并且小于集合的大小。

打印MergedDictionaries的计数后,我发现它等于0

Themes dir and contents

编辑:我发现该应用可能由于某种错误而无法加载'Light.xaml',所以我想添加其内容:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:PC_SmartStay.Themes" xmlns:System="clr-namespace:System;assembly=System">

<SolidColorBrush x:Key="MyBackgroundBrush" Color="{DynamicResource {x:Static SystemColors.ControlLightLightColorKey}}" />
<SolidColorBrush x:Key="TextBrush" Color="{DynamicResource {x:Static SystemColors.ControlTextColorKey}}" />

</ResourceDictionary>

1 个答案:

答案 0 :(得分:0)

我发现答案很简单。
创建WPF项目时,'app.xaml.cs'如下所示:

public partial class App: Application
{

}

尽管,当我在'app.xaml'中创建ResourceDictionary并将其添加到其MergedDictionaries中时,我需要使程序使用'app .xaml',除非我不会像在其他窗口中那样添加InitializeComponent();,否则它不会这样做。
我想这不是完整的解释,但肯定对我有用。