13

2つのライブラリと1つのアプリケーションアセンブリプロジェクトレイアウトがあり、一方のライブラリで定義されているもう一方のライブラリのキーでスタイルを参照するにはどうすればよいのでしょうか。

私のソリューションレイアウト:

  • WpfControls.dll -WPFベースのNumericUpDownコントロール、その他の基本的なコントロール、および再利用可能にしたいいくつかのスタイルなど、一般的な再利用可能なコントロールを保持します。例のために、ここでの私のスタイルキーがMyButtonStyleとして定義されているとしましょう。
  • SpecializedControls.dll-カスタム複合コントロールやWPFのUserControlsなど、アプリケーションに特化したコントロールを保持します。ここで、WpfControls.dllアセンブリで定義されているMyButtonStyleスタイルを参照します。
  • Application.exe-このアセンブリは、SpecializedControls.dllアセンブリで定義されたコントロールを使用します。

単純な単一のコントロールライブラリとアプリケーションアセンブリを使用してこれを行う方法を説明する例を見てきましたが、私の場合は2つのアセンブリと1つのアプリケーションがあります。つまり、私の場合、MergeDictionariesの概念を使用できる2番目のコントロールライブラリにApp.xamlがありません。MergedDictionaries参照を各コントロールXAMLファイルに直接配置して、WpfControls.dllアセンブリで定義されたすべてのGeneric.xamlをマージできると確信していますが、これにより、スタイルがさまざまな場所に冗長にマージされると思います。私のSpecializedControlsアセンブリでは、これは最善の解決策とは思えません。さらに悪いことに、これらの辞書もApplication.exeにマージされる可能性がありますが、これにより、実行時にアプリケーションが肥大化し始めますか?

プログラムとリソースのオーバーヘッドを最小限に抑えて、このようなスタイルを共有するための推奨または最善のアプローチを誰かが明確にできますか。

更新:もう少しテストしたところ、同じアセンブリ内であっても、Generic.xaml内で定義されているリソースをそのキーで参照するのに問題があるようです。リソースキーがどのように機能するかを理解している方法にまったく問題がある可能性があるため、ComponentResourceKeyを調べるだけでなく、もう少し調査する必要があります。誰かが何かヒントや提案があれば助けてください。

4

2 に答える 2

15

WPFでのリソースルックアップは、論理ツリーの上位、次にアプリケーションリソース、テーマリソース、最後にシステムリソースの階層で機能します。

テーマリソースには通常、暗黙的にのみアクセスできます(アセンブリ内でもそれらが定義されています)。これは、TargetTypeを暗黙のキーとして使用できるスタイルにのみ関連します。

あなたがやろうとしていることを達成するために、2つのオプションがあります:

  • ComponentResourceKeyを使用します。これは、他のアセンブリからリソースを参照できるようにする特別なリソースキーです。たとえば、WpfControlsテーマディクショナリでブラシを定義できます。

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    

    そして、 SpecializedControlsでそれを参照できます:

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
  • MergedDictionariesを使用して、辞書をアプリケーションリソースにインポートします。これはアプリケーションアセンブリで実行でき、アプリケーションが読み込まれると、SpecializedControlsにあるコントロールでもこれらのリソースを使用できるようになります。このシナリオでは、設計時のエクスペリエンスに問題が発生します。これは、辞書への参照も含まれる偽のApp.xamlをSpecializedControlsに配置することで解決できます。

お役に立てれば、

Aelij。

于 2010-02-18T14:34:29.210 に答える
0

受け入れられた答えは正しいです、私はMergedDictionariesの使い方を説明しているだけです

App.xamlでは、

    <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/-DirectoryName-/FileName.xaml"/>
            <!-- Use Below syntax if your resource file is not inside a directory(in root) -->
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/FileName.xaml"/>
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
于 2019-02-06T11:47:02.507 に答える