8

WPF アプリケーションとは別の dll に BaseSkin と複数の UserSkins があります。

誰がアプリケーションを使用しているかに応じて、ベース スキンとユーザー スキンの 1 つがリソース ディクショナリにマージされ、アプリケーションが使用するために読み込まれます。

私が目指しているのは、BaseSkin ファイルでスタイルを指定し、特定の UserSkin ファイルでそれをオーバーライドして、必要なプロパティを変更できるようにすることです。

次のような BasedOn 属性を使用することで、これを実現できることがわかっています。

ベース:

<Style x:Key="ButtonBg" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Green"/>
</Style>

ユーザー:

<Style x:Key="CustomButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonBg}">
    <Setter Property="Background" Value="Blue"/>
</Style>

問題は、要素が CustomButtonBg のスタイルを持たなければならず、実際には実装されていない可能性があることです。両方のスタイルで同じキー (ButtonBg) を使用する方法はありますか?それらがマージされると、アプリケーションは最初に User で ButtonBg という名前のスタイルを探し、存在しない場合はベースのスタイルを使用しますか?

BaseSkin ファイルを指すように BasedOn 属性でアセンブリ名を指定できれば、同じキーを指定したときに命名エラーを回避できると考えていましたが、それを行う方法が見つかりません。他のオプションは、何も変更されていなくても各スタイルの実装を強制するか、プログラムでスキンをチェックすることですが、これらは最後の手段です。

4

2 に答える 2

11

リソースルックアップロジックを利用してみることができます。WPFがキーでリソースを検索しようとすると、最初に現在の要素ResourceDictionary、次にその親、次にその親というように検索されます。

つまり、ユーザーに条件付きであると言ったので、元のベースがレベル​​にある間ResourceDictionaryに、レベルでマージすることができます。WindowApplication

編集:私はより良い情報を持っています。マージされた辞書に関するMSDNから:

マージされた辞書の動作

マージされたディクショナリ内のリソースは、それらがマージされたメインリソースディクショナリのスコープの直後にあるリソースルックアップスコープ内の場所を占めます。リソースキーは個々のディクショナリ内で一意である必要がありますが、キーはマージされたディクショナリのセットに複数回存在する可能性があります。この場合、返されるリソースは、MergedDictionariesコレクションで順番に見つかった最後のディクショナリから取得されます。MergedDictionariesコレクションがXAMLで定義されている場合、コレクション内のマージされたディクショナリの順序は、マークアップで提供されている要素の順序です。キーがプライマリディクショナリとマージされたディクショナリで定義されている場合、返されるリソースはプライマリディクショナリから取得されます。

つまり、ベーススキンを別のスキンで定義し、別のスキンにResourceDictionaryマージすることができますResourceDictionary。後者のユーザースキンを使用すると、最初にユーザースキンが検出されます。それ以外の場合は、Baseを含むマージされたディクショナリにドリルダウンし続けます。各ユーザーディクショナリはベースディクショナリをマージでき、両方を個別にではなく、ユーザーディクショナリをアプリにロードするだけです。

于 2009-07-30T20:38:36.827 に答える
0

BaseにBaseButtonBgという名前を付けるだけで、ユーザーベースのResourceDictionaryをマージしない場合は、以下を含む一般的なものをマージします。

<Style x:Key="ButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonBg}"/>
于 2009-07-30T20:33:02.987 に答える