0

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 が行うことです。どのように?

別の言い方をすれば、同じ動作を示す独自のクラスを作成したい場合 (しゃれは意図していません)、ビジュアル ツリーのリソース階層にどのように挿入するのでしょうか?

4

1 に答える 1