如何通过存储在App.xaml中的资源字典中的代码动态更改样式?

如何通过存储在App.xaml中的资源字典中的代码动态更改样式?,xaml,uwp,Xaml,Uwp,我正在尝试让整个应用程序中的几个核心颜色能够由用户动态更改。我现在的想法是使用一个SolidColorBrush作为我的“主题颜色”,然后在我的主要风格中引用它 <SolidColorBrush x:Key="ReflectiveColor1" Color="#FF0E777B"></SolidColorBrush> 错误: System.Runtime.InteropServices.COMException: 'No installed components wer

我正在尝试让整个应用程序中的几个核心颜色能够由用户动态更改。我现在的想法是使用一个SolidColorBrush作为我的“主题颜色”,然后在我的主要风格中引用它

<SolidColorBrush x:Key="ReflectiveColor1" Color="#FF0E777B"></SolidColorBrush>
错误:

System.Runtime.InteropServices.COMException: 'No installed components were 
detected.
Local values are not allowed in resource dictionary with Source set 

有没有办法让这一切顺利?我假设此错误是因为它不希望我们修改存储在那里的样式,但我不知道解决方法。

应用程序将无法找到资源
ReflectVeColor1
,直到您将所有资源字典合并在一起

更改
App.xaml
以合并词典。如下图所示

<Application.Resources>
    <ResourceDictionary >
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="DictionaryAlienwareTheme.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>


然后,您应该能够以与以前相同的方式访问资源。

在将所有资源字典合并到一起之前,应用程序将无法找到该资源

更改
App.xaml
以合并词典。如下图所示

<Application.Resources>
    <ResourceDictionary >
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="DictionaryAlienwareTheme.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>


然后你应该能够以与以前相同的方式访问资源。

首先,在你的
App.xaml
中,如果你想引用你自己定义的
DictionaryAlienwareTheme.xaml
,你需要像@AVK所说的那样将字典合并到当前的应用程序中。有关更多详细信息,请参阅的“合并资源字典”部分

其次,在使用合并资源后,如果要更新后面的主题资源代码,可能需要使用
Application.Current.Resources.MergedDictionaries
来访问合并词典,而不是
Application.Current.Resources
。比如说,

public MainPage()
{
   this.InitializeComponent(); 
   var mergedDict = Application.Current.Resources.MergedDictionaries.FirstOrDefault();
   ((SolidColorBrush)mergedDict["ReflectiveColor1"]).Color = Colors.Red;
}

顺便说一句,正如上面的代码片段所示,
ReflectiveColor1
SolidColorBrush
您不能直接设置颜色。

首先,在您的
App.xaml
中,如果您想引用您自己定义的
DictionaryAlienwareTheme.xaml
,您需要将字典合并到当前的应用程序中,如@AVK所说。有关更多详细信息,请参阅的“合并资源字典”部分

其次,在使用合并资源后,如果要更新后面的主题资源代码,可能需要使用
Application.Current.Resources.MergedDictionaries
来访问合并词典,而不是
Application.Current.Resources
。比如说,

public MainPage()
{
   this.InitializeComponent(); 
   var mergedDict = Application.Current.Resources.MergedDictionaries.FirstOrDefault();
   ((SolidColorBrush)mergedDict["ReflectiveColor1"]).Color = Colors.Red;
}

顺便说一句,正如上面的代码片段所示,
ReflectiveColor1
SolidColorBrush
您不能直接设置颜色。

这似乎不能完全工作,尽管它更接近。在另一个XAML中,您将如何引用ReflectColor 1?我尝试过绑定和源代码,但它们似乎没有更新到代码中选择的颜色。这似乎没有完全起作用,尽管它更接近。在另一个XAML中,您将如何引用ReflectColor 1?我尝试了绑定和源代码,但它们似乎没有更新到代码中选择的颜色。颜色分配也错误。您正在尝试为以前的SolidColorBrush指定颜色。它可能是
((SolidColorBrush)Application.Current.Resources[“ReflectiveColor1”])。Color=Colors.Black颜色分配也错误。您正在尝试为以前的SolidColorBrush指定颜色。它可能是
((SolidColorBrush)Application.Current.Resources[“ReflectiveColor1”])。Color=Colors.Black我完全按照您的要求完成了操作,但仍然收到错误-“System.Runtime.InteropServices.COMException:“未检测到任何已安装的组件。在源代码集为[Line:0 Position:0]的资源字典中不允许使用本地值”。我完全按照您的要求完成了操作,仍然收到错误-“System.Runtime.InteropServices.COMException:'未检测到安装的组件。在源集为[行:0位置:0]的资源字典中不允许使用本地值“