スキンを変更する必要がある項目の中に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
特に、いくつかのより多くの本を研究した後
は、私たちの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です。
非常に混乱していて、私たちは間違ったツリーを完全に吠えていると思います。ではどこが間違っているのですか?
誰かが問題を再現するアプリケーションの完全なコードを必要とする場合、私はそれを投稿することができます。
どのポインタも大変感謝しています。
あなたは正しいと思います。返信してくれてありがとう、遅れての謝辞を送ってくれて申し訳ありません。(質問はあまりにも長い間答えられていませんでした。 – Nick