在更新资源时,应用程序资源定义的刷子中的WPF边框背景bount将不会更新

时间:2013-03-13 15:06:24

标签: c# wpf

您好,

所以这将是我的第一个问题,因为我找不到任何可以解决我问题的内容。


初始状况

我在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文件中定义的颜色。


实际问题

现在我将SolidColorBrushColor的定义移到我的 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并在那里读取和更新它们,所以我不必将它们传递到首选项窗口并再次从那里读取它们。

2 个答案:

答案 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);