2012-02-02 9 views
1

スキンを変更する必要がある項目の中にDynamicResourceExtention型の値をサポートしていない場合、WPFアプリケーションの動的スキニングを有効にするにはどうすればよいですか?特に、私たちの問題は、ConverterParametersがStaticResourceExtentionsを必要とすることです。ConverterParametersの動的スキニングを有効にする方法

ここでは、Visual Studio 2008とWPF 3.5を使用したConverterParametersの状況を示します。

値とパラメータを受け取り、単に商品を返すカスタムコンバーターがあります。 非常に単純で、うまく機能し、いくつかのウィンドウ要素のサイズを設定するなど、さまざまなタスクに使用します。たとえば、「Source = {x:Static SystemParameters.PrimaryScreenHeight}」というパラメータと「0.1」のパラメータを渡すと、要素の高さを画面の高さのちょうど1/10に設定できます。

Height="{Binding Source={x:Static SystemParameters.PrimaryScreenHeight}, 
        Converter={StaticResource PctConverter}, 
        ConverterParameter=0.1}" 

ここで、PctConverterはカスタムコンバータのリソース参照です。問題はない。

これで、ConverterParameterを抽出して別のリソースに入れることで、アプリケーションを動的にスキンしたいと考えています。たとえば、要素の高さをいくつかのスキンではスクリーンの高さの0.1にし、他のものではスクリーンの高さの0.25とすることができます。 OurElementHeightParameterが別々のResourceDictionaryで定義されている

Height="{Binding Source={x:Static SystemParameters.PrimaryScreenHeight}, 
      Converter={StaticResource PctConverter}, 
      ConverterParameter={StaticResource OurElementHeightParameter}}" 

(それを呼び出す:最初は、私たちは単にDynamicResourceにConverterParameterを設定すると思いますが、これはサポートされていないので、我々はこのようStaticResourceExtensionを使用して、それを設定する必要が考えられMainResource.xamlは)としては、以下:

<sys:Double x:Key="OurElementHeightParameter">0.1</sys:Double> 

(ネームスペースはのxmlnsとして定義される:SYS = "CLR名前空間:システム、アセンブリ= mscorlib")これは抽出限り、正常に動作

を。 CustomParameterが関係していますが、それでもその場でスキンを交換することによってConverterParameterを変更することはできませんでした。我々は我々が今する必要があると思うものを、次の記事

How to assign wpf resources to other resource tags

Skinning using a color as staticresource for another color

Aliasing resources

特に、いくつかのより多くの本を研究した後

は、私たちのStaticResourceExtentionを取り、その値を設定していますリソースエイリアスを使用して動的にシーンの背後にある。これを実行しようとすると

は、我々は同じ結果を生成、正常に動作し、次の2つのリソース

と以前OurElementHeightParameterリソースを置き換えます。

私たちは、SkinnedHeightRatioリソースを別個のResourceDictionary(Skin.xamlと呼ぶ)に配置し、それを元のMainResource.xaml ResourceDictionaryとマージして、ダイナミックスキニング私たちは後です。

しかし、できるだけ早く我々は次のようにエラーを構築遭遇する別のResourceDictionaryに<sys:Single x:Key="SkinnedHeightRatio">0.1</sys:Single>を抽出して:

不明なビルドエラーを、「インデックスが範囲外でした。負でなく、コレクションのサイズより小さくなければなりません。

さらに奇妙な我々は同じのResourceDictionaryに上記の2つのリソースを維持し、ちょうどそれらの間に別のランダムなリソースを置くことによって、それらを区切る場合ということで、例えば

<sys:Double x:Key="SkinnedHeightRatio">0.1</sys:Double> 
<Thickness x:Key="SomeRandomResource" >5</Thickness> 
<StaticResourceExtension x:Key="OurElementHeightParameter" ResourceKey="SkinnedHeightRatio" /> 

真上SomeRandomResourceに続いOurElementHeightParameterポイントその上に2行しかないResourceKeyプロパティ(SkinnedHeightRatio)に指定されている リソースではありません。 この場合、コンバータに渡されるパラメータはThickness SomeRandomResourceです。

非常に混乱していて、私たちは間違ったツリーを完全に吠えていると思います。ではどこが間違っているのですか?

誰かが問題を再現するアプリケーションの完全なコードを必要とする場合、私はそれを投稿することができます。

どのポインタも大変感謝しています。

答えて

0

多値コンバータを作成して2つの値にバインドする方が簡単かもしれません。

+0

あなたは正しいと思います。返信してくれてありがとう、遅れての謝辞を送ってくれて申し訳ありません。(質問はあまりにも長い間答えられていませんでした。 – Nick

関連する問題