您好,
所以这将是我的第一个问题,因为我找不到任何可以解决我问题的内容。
初始状况
我在SolidColorBrush
<Window.Resources>
<SolidColorBrush x:Key="BackgroundBrush" Color="{DynamicResource BackgroundColor}"/>
<Color x:Key="BackgroundColor">PeachPuff</Color>
然后我将Border
绑定到SolidColorBrush
<Border Background="{DynamicResource ResourceKey=BackgroundBrush}" />
在应用程序启动时,我读取了一个保存背景颜色的xml文件。
// Some XML Loading stuff -> backgroundColor is a Color
this.Resources["BackgroundColor"] = backgroundColor;
这就像一个魅力。我可以更改xml文件中的颜色,边框的背景是我在xml文件中定义的颜色。
实际问题
现在我将SolidColorBrush
和Color
的定义移到我的 App.xaml 文件中,并更改了方法以将颜色更改为:
Application.Current.Resources["BackgroundColor"] = backgroundColor;
但现在边境的背景不再改变了。它只是边框的默认颜色。无论我在xml文件中写什么。
当我调试
中的内容时 Application.Current.Resources["BackgroundColor"]
由
指定的颜色 Application.Current.Resources["BackgroundColor"] = backgroundColor;
实际上在
Application.Current.Resources["BackgroundColor"]
但背景未更改 ...
背景
我有两个窗户。主窗口和首选窗口。在首选项窗口中,我希望能够更改主窗口的FontFamily / Type / Weight / Color等。
我的第一种方法是在主窗口资源中定义所有样式,并将我想要更改的值传递到首选项窗口并读出更改,然后更新主窗口资源中的资源。
由于这非常有效,我现在想将样式移到app.xaml并在那里读取和更新它们,所以我不必将它们传递到首选项窗口并再次从那里读取它们。
答案 0 :(得分:1)
无法重现。以下代码适用于我(边框显示为azure):
我的一个建议是确保您从窗口中删除了资源。 XAML绑定将绑定到最近的资源,该资源将是窗口资源(而不是应用程序资源),因此您将绑定到您未更改的资源。
MainWindow.xaml:
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfApplication3="clr-namespace:WpfApplication3"
Title="MainWindow" Height="350" Width="525"
x:Name="Window">
<Window.Resources>
</Window.Resources>
<Grid>
<Border Background="{DynamicResource BackgroundBrush}">
<Button Margin="10">Test</Button>
</Border>
</Grid>
</Window>
的App.xaml:
<Application x:Class="WpfApplication3.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<SolidColorBrush x:Key="BackgroundBrush" Color="{DynamicResource BackgroundColor}"/>
<Color x:Key="BackgroundColor">PeachPuff</Color>
</Application.Resources>
</Application>
MainWindow.xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Application.Current.Resources["BackgroundColor"] = Colors.Azure;
}
}
答案 1 :(得分:0)
好的,我找到了解决方案。
我将样式放入ResourceDictionary
,实际上没有任何帮助。
<强> BUT:强>
当我在修改资源字典后重新加载资源字典时,会应用样式。
实际上我认为如果在清除合并的词典之前没有应用的更改,它会加载字典吗?
Application.Current.Resources["BackgroundColor"] = this.SelectedBackgroundColor;
Application.Current.Resources.MergedDictionaries.Clear();
var dictionary = new ResourceDictionary();
dictionary.Source = new Uri("ControlStyles.xaml", UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Add(dictionary);