特にリソースルックアップのパフォーマンスに関しては、リソースディクショナリとマージディクショナリ全般に問題があります。いくつかのパフォーマンステストの結果、ResourceDictionary.get_MergedDictionariesが最もヒット数の多い呼び出しであることがわかりました(ANTSプロファイラーでチェック済み)。約300のリソースディクショナリxamlsがあり、それらの多くは、他のスタイルを「含める」ためにマージされたディクショナリを使用しています。get_MergedDictionariesは、アプリケーションの一部で、あまり発生していない部分で、約1,000万ヒットでした。ですから、私の推測では、一般的にリソースディクショナリで完全に間違ったことをしているのです。だから私はすべてをリファクタリングしようとしました、そして私はすべてのマージされた辞書を取り除くことを試みたいです。
さて、実際の質問に移りましょう。マージディクショナリを削除しようとしましたが、失敗しました。私の理解では、StaticResourceを使用する場合、ルックアップでは現在のリソースの前にリソースを定義する必要があります。次の短い例を作成しました。
1つのメインプロジェクトと1つのカスタムコントロールライブラリ。
カスタムコントロールライブラリには2つのxamlsが含まれています。
<!-- Colors.xaml -->
<ResourceDictionary [stripped namespaces] >
<SolidColorBrush x:Key="myColor" Color="Green"/>
</ResourceDictionary>
<!-- Templates.xaml -->
<ResourceDictionary [stripped namespaces]>
<ControlTemplate x:Key="myTemplate" TargetType="Button">
<Rectangle Fill="{StaticResource myColor}"/>
</ControlTemplate>
</ResourceDictionary>
メインプロジェクトでは、MainWindow.xamlは次のようになります
<Window x:Class="ResourceTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourceTestLib;component/Themes/Colors.xaml"/>
<ResourceDictionary Source="/ResourceTestLib;component/Themes/Template.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Button Template="{StaticResource myTemplate}"/>
</Grid>
</Window>
それが望ましい目標です。ただし、リソース「myColor」が見つからないため、残念ながらこれはクラッシュします。もちろん、それを修正する方法を知っています。Templates.xamlにmergeddictionaryを追加し、Colors.xamlを参照しますが、論理ツリーと要素のリソースに応じてリソースが検索されることを常に考えていました。私の理解は; ボタンが作成されます。テンプレートを検索してみてください..見つかりました; 自分のリソースでは見つからない色を検索し、上に移動してWindowsリソースを使用してみてください。
私は間違っているようです。だから私は誰かが私のためにこれにいくつかの光を当てることができることを願っています。WPFを多用し、それにもかかわらず多くのことを達成しましたが、最初に学習した動作が間違っていたため、リソースの検索だけでパフォーマンスがかなり悪くなりました。どんな助けでも大歓迎です
よろしくお願いしますニコ