背景:
我试图使我的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
编辑:我发现该应用可能由于某种错误而无法加载'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>
答案 0 :(得分:0)
我发现答案很简单。
创建WPF项目时,'app.xaml.cs'如下所示:
public partial class App: Application
{
}
尽管,当我在'app.xaml'中创建ResourceDictionary
并将其添加到其MergedDictionaries
中时,我需要使程序使用'app .xaml',除非我不会像在其他窗口中那样添加InitializeComponent();
,否则它不会这样做。
我想这不是完整的解释,但肯定对我有用。