別のライブラリの別のアセンブリで定義された WPF スタイル キーを参照する方法
-
25-09-2019 - |
質問
2 つのライブラリと 1 つのアプリケーション アセンブリ プロジェクト レイアウトがあります。一方のライブラリでもう一方のライブラリで定義されているキーでスタイルを参照するにはどうすればよいでしょうか。
私のソリューションのレイアウト:
- WpfControls.dll - WPF ベースの NumericUpDown コントロールなどの一般的な再利用可能なコントロール、その他の基本的なコントロール、および再利用可能にしたいいくつかのスタイルを保持します。例のために、ここでの私のスタイルキーが次のように定義されているとしましょう。 私のボタンスタイル.
- SpecializedControls.dll - カスタム複合コントロールや WPF の UserControl など、アプリケーションに特化したコントロールを保持します。ここで参考にしたいのが、 私のボタンスタイル WpfControls.dll アセンブリで定義されたスタイル。
- アプリケーション.exe - このアセンブリは、SpecializedControls.dll アセンブリで定義されたコントロールを使用します。
単純な単一のコントロール ライブラリとアプリケーション アセンブリを使用してこれを行う方法を説明する例をいくつか見てきましたが、私の場合は 2 つのアセンブリと 1 つのアプリケーションがあります。つまり、私の場合、MergeDictionaries コンセプトを使用できる 2 番目のコントロール ライブラリに App.xaml がありません。必要に応じて、各コントロールの XAML ファイルに MergedDictionaries 参照を直接配置して、WpfControls.dll アセンブリで定義されている Generic.xaml をすべてマージできると確信していますが、私の推測では、これによりスタイルがさまざまな場所に冗長にマージされることになります。私の SpecializedControls アセンブリでは、最良の解決策とは思えません。さらに悪いことに、これらの辞書も Application.exe にマージされる可能性があります。これにより、実行時にアプリケーションが肥大化し始めますか?
プログラムやリソースのオーバーヘッドを最小限に抑えてそのようなスタイルを共有するための推奨または最善のアプローチを誰かが明確にできますか。
アップデート:もう少しテストしたところ、同じアセンブリ内であっても、Generic.xaml 内で定義されたリソースをキーで参照するのに問題があるようです。リソース キーの仕組みについて私の理解が完全に間違っている可能性があるため、ComponentResourceKey について調べるだけでなく、もう少し調査する必要があります。誰かがヒントや提案を持っている場合は、助けてください。
解決
WPF のリソース検索は階層内で機能します。論理ツリー、アプリケーション リソース、テーマ リソース、最後にシステム リソースの順に進みます。
テーマ リソースには通常、(定義されているアセンブリ内であっても) 暗黙的にのみアクセスできます。これは、TargetType を暗黙のキーとして使用できるスタイルにのみ関係します。
やろうとしていることを達成するには、次の 2 つのオプションがあります。
使う コンポーネントリソースキー. 。これは、他のアセンブリからリソースを参照できるようにする特別なリソース キーです。たとえば、次のようにブラシを定義できます。 Wpfコントロール テーマ辞書:
<LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}"> <GradientStop Color="Red" /> <GradientStop Color="Blue" Offset="1" /> </LinearGradientBrush>
そして、それを参照できます 特殊なコントロール:
<UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
使用 マージされた辞書 辞書をアプリケーション リソースにインポートします。これは、 応用 アセンブリ、およびアプリケーションのロード時に、 特殊なコントロール これらのリソースを使用できるようになります。このシナリオではデザイン時のエクスペリエンスに問題が発生しますが、偽の App.xaml を配置することで解決できます。 特殊なコントロール, 、これには辞書への参照も含まれます。
お役に立てれば、
アエリジ。
他のヒント
は受け入れ答えは、私はちょうど使用する方法を説明しています、正しいの 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>