Behavior
今夜、動的リソースに関する問題を解決する際に、関連するフレームワーク要素のリソース階層に参加するクラスの機能に依存するソリューションにたどり着きました。たとえば、次のことを検討してください。
<Application>
<Application.Resources>
<system:String x:Key="TestString">In App Resources</system:String>
</Application.Resources>
</Application>
<Window>
<Window.Resources>
<system:String x:Key="TestString">In Window Resources/system:String>
</Window.Resources>
<Border>
<Border.Resources>
<system:String x:Key="TestString">In Border Resources</system:String>
</Border.Resources>
<TextBlock Text="{DynamicResource TestString}" />
</Border>
</Window>
TextBlock は、境界線からリソースを表示します。でも、これをやると…
public void Test()
{
var frameworkElement = new FrameworkElement();
var testString = (string)frameworkElement.FindResource("TestString");
}
...ビジュアルツリーの一部ではないため、アプリケーションからのものを見つけます。
そうは言っても、代わりにこれを行うと...
public class MyBehavior : Behavior<FrameworkElement>
{
public string Value... // Implement this as a DependencyProperty
}
次に、このように TextBlock に追加します...
<TextBlock Text="{DynamicResource TestString}">
<i:Interaction.Behaviors>
<local:MyBehavior Value="{DynamicResource TestString}" />
</i:Interaction.Behaviors>
</TextBlock>
動作はリソースの値を取得し、動的に追跡します。しかし、どのように?
Behavior は FrameworkElement ではないため、それに対して SetResourceReference を呼び出すことはできず、ビジュアル ツリーの一部でもないため、SetResourceReference を呼び出すことができたとしても、FrameworkElement に対してローカルなリソースを見つけることはできません。しかし、それはまさに Behavior が行うことです。どのように?
別の言い方をすれば、同じ動作を示す独自のクラスを作成したい場合 (しゃれは意図していません)、ビジュアル ツリーのリソース階層にどのように挿入するのでしょうか?