Индекс 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
РЕДАКТИРОВАТЬ: я понял, что вполне возможно, что приложение не загружает '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();
как в каждом другом окне.
Я думаю, это не полное объяснение, но оно, безусловно, сработало для меня.