WPFネタです。半日くらい悩んでいました
準備
App.xaml
抜粋
<ApplicationResources>
<Color xKey="FillColor">#00ffff</Color>
<SolidColorBrush xKey="FillBrush" Color="{DynamicResource FillColor}"/>
</ApplicationResources>
MainWindow.xaml
<Grid>
<GridRowDefinitions>
<RowDefinition/>
<RowDefinition/>
</GridRowDefinitions>
<GridColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</GridColumnDefinitions>
<Rectangle Fill="{DynamicResource FillBrush}"/>
<Rectangle GridColumn="1">
<RectangleFill>
<SolidColorBrush Color="{DynamicResource FillColor}"/>
</RectangleFill>
</Rectangle>
<Button GridRow="1" Content="Red" Click="RedButton_Click"/>
<Button GridRow="1" GridColumn="1" Content="Green" Click="GreenButton_Click"/>
</Grid>
MainWindow.xaml.cs
private void RedButton_Click(object sender, RoutedEventArgs e)
{
Application.Current.Resources["FillColor"] = Colors.Red;
}
private void GreenButton_Click(object sender, RoutedEventArgs e)
{
Application.Current.Resources["FillColor"] = Colors.Green;
}
やっていること
- アプリケーションのリソースに
FillColor
というキーのColorとそのColorをDynamicResourceで参照しているFillBrush
を用意します
- Windowの左側のRectangle.Fillには
FillBrush
をDynamicResourceで入れておきます
- 右側のRectangle.FillにはXAMLでSolidColorBrushを書いて、そのColorを
{DynamicResource FillColor}
とします
- ボタン二つは押したときに
FillColor
の色を変えるようにしています
動作結果
これを動かすと

MainWindow.xamlで{DynamicResource FillColor}
とした方だけが色が変わります。気持ち的には両方変わってほしいんですけどねぇ
ググるとStackOverflowに
stackoverflow.com
というのが出てきて、SolidColorBrushはFrameworkElementでもFrameworkContentElementでもないからダメ、みたいな解答が書いてあります。サンプルのRectangleが両方色が変わらなかったら納得なんですけどね。ちなみに英語力皆無なので本当にそういうことが書いてあるのかは知りません
おまけ
App.xamlの定義をMainWindow.xamlに持ってきて同じようなことをしてみます
MainWindow.xaml
<WindowResources>
<Color xKey="FillColor">#00ffff</Color>
<SolidColorBrush xKey="FillBrush" Color="{DynamicResource FillColor}"/>
</WindowResources>
<Grid>
<GridRowDefinitions>
<RowDefinition/>
<RowDefinition/>
</GridRowDefinitions>
<GridColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</GridColumnDefinitions>
<Rectangle Fill="{DynamicResource FillBrush}"/>
<Rectangle GridColumn="1">
<RectangleFill>
<SolidColorBrush Color="{DynamicResource FillColor}"/>
</RectangleFill>
</Rectangle>
<Button GridRow="1" Content="Red" Click="RedButton_Click"/>
<Button GridRow="1" GridColumn="1" Content="Green" Click="GreenButton_Click"/>
</Grid>
MainWindow.xaml.cs
private void RedButton_Click(object sender, RoutedEventArgs e)
{
Resources["FillColor"] = Colors.Red;
}
private void GreenButton_Click(object sender, RoutedEventArgs e)
{
Resources["FillColor"] = Colors.Green;
}
結果

両方変わるよぉぉぉ