Индекс MergedDictionaries вне диапазона wpf app.xaml

Фон:
Я пытался сделать так, чтобы моя цветовая схема формы WPF соответствовала цветовой схеме окон. Для этого я обнаружил метод, который включает в себя предварительное определение темы, что означает, что мне нужно изменить MergedDictionaries[0].source,
Как описано здесь

Это мое Application.Resources который, как вы можете видеть, указывает на источник "Themes / light.xaml".
Внутри "Темы" я создал 2 менеджера тем: "Light.xaml", "Dark.xaml"

<Application.Resources>

    <ResourceDictionary>

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

    </ResourceDictionary>

</Application.Resources>

В случае, если я использую тему Windows Dark, я хочу, чтобы пользовательский интерфейс тоже менялся, и вот как я это делаю:

WindowsTheme initialTheme = GetWindowsTheme();

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

(обратите внимание, что "WindowsTheme" и "GetWindowsTheme" - это enum и function)


Теперь о проблеме:

Каждый раз, когда я пытаюсь запустить программу, она выдает это исключение:

Возникло исключение: "System.ArgumentOutOfRangeException" в mscorlib.dll Произошло необработанное исключение типа "System.ArgumentOutOfRangeException" в индексе mscorlib.dll вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции.

После печати счетчик MergedDictionaries Я узнал, что это равно 0

Темы dir и содержание

РЕДАКТИРОВАТЬ: я понял, что вполне возможно, что приложение не загружает '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 ответ

Я нашел ответ из-за простой вещи.
При создании проекта WPF файл app.xaml.cs выглядит следующим образом:

public partial class App: Application
{

}

Хотя, когда я создаю ResourceDictionary в app.xaml и добавьте его в свой MergedDictionaries Мне нужно заставить программу использовать app.xaml, чего не происходит, если я не добавлю InitializeComponent(); как в каждом другом окне.
Я думаю, это не полное объяснение, но оно, безусловно, сработало для меня.

Другие вопросы по тегам