WPFネタですよと。
DynamicResourceはWPFのリソースと、依存プロパティを動的に結びつけ、リソースが変化したときに自動的に依存プロパティ側にも波及させます。
StaticResourceは作成時に1回だけ波及させます。
一般的な使い方
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<SolidColorBrush Color="Red" x:Key="br" />
</Window.Resources>
<Grid Background="{DynamicResource br}">
<Button Margin="10" Click="bc"/>
</Grid>
</Window>
private void bc(object sender, RoutedEventArgs e)
{
Resources["br"] = new SolidColorBrush(Color.FromRgb(0, 0, 255));
}
Gridの背景色をリソースから設定します。
それをボタンの処理で入れ替えているのがこのコードです。
んじゃこのDynamicResourceをコードからバインドするにはどうすればいいのか。
結構大変です。
ちょっとしらべるとDynamicResourceExtensionを使うというところにまでいきつき、豆司馬さんのところに行きつくわけですが。
http://d.hatena.ne.jp/shiba-yan/20080427/1209224429
というか、しばやんについったーでできるようん。って行ったから調べてたり(^^;;
でバインディングというか、リソース設定は以下のコードで可能
var dre = new DynamicResourceExtension("br");
gr.SetValue(BackgroundProperty, dre.ProvideValue(new ss()));
でこのssっていう適当なのがIServiceProvider, IProvideValueTargetをただ実装するだけです。
public class ss : IServiceProvider, IProvideValueTarget
{
public object GetService(Type service)
{
if (service == typeof(IProvideValueTarget))
{
return this;
}
return null;
}
internal void SetData(object targetObject, object targetProperty)
{
TargetObject = targetObject;
TargetProperty = targetProperty;
}
public object TargetObject { get; private set; }
public object TargetProperty { get; private set; }
}