1

やあ、

問題に答えられるものが見つからなかったので、これが私の最初の質問になります。


初期状況

私は自分で定義し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ここで、との定義をApp.xamlファイルに移動しColorを次のように変更するメソッドを変更しました。

Application.Current.Resources["BackgroundColor"] = backgroundColor;

しかし、今では境界線の背景はもう変わりません。これは、境界線のデフォルトの色です。xmlファイルに何を書き込んでも。

何が入っているかをデバッグするとき

Application.Current.Resources["BackgroundColor"]

によって割り当てられた色

Application.Current.Resources["BackgroundColor"] = backgroundColor;

実際に

Application.Current.Resources["BackgroundColor"]

しかし、背景は変更されません...


バックグラウンド

2つのウィンドウがあります。メインウィンドウと設定ウィンドウ。設定ウィンドウで、メインウィンドウのFontFamily / Type / Weight/Colorなどを変更できるようにしたいと思います。

私の最初のアプローチは、メインウィンドウリソースですべてのスタイルを定義し、変更する値を設定ウィンドウに渡して変更を読み取り、メインウィンドウリソースのリソースを更新することでした。

これは非常にうまく機能したので、スタイルをapp.xamlに移動して、そこで読み取り、更新したかったので、設定ウィンドウにスタイルを渡して、そこから再度読み取る必要はありません。

4

2 に答える 2

1

再現できません。次のコードは私のために機能します(境界線は紺碧として表示されます):

私の1つの提案は、ウィンドウからリソースを削除したことを確認することです。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;
    }

}
于 2013-03-13T15:27:01.313 に答える
0

さて、私は解決策を見つけました。

ResourceDictionary私は実際には何も役に立たなかったスタイルを入れました。

しかし:

変更後にリソースディクショナリをリロードすると、スタイルが適用されます。

実際、マージされた辞書をクリアする前に、変更を適用せずに辞書をロードすると思いましたか?

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);
于 2013-03-14T08:14:57.433 に答える