У меня проблема со словарями ресурсов и объединенными словарями в целом, особенно когда речь идет о производительности поиска ресурсов. После некоторого тестирования производительности я обнаружил, что ResourceDictionary.get_MergedDictionaries - это вызов с наибольшим количеством совпадений (проверено в профилировщике ANTS). У нас есть около 300 xamls словарей ресурсов, и многие из них используют объединенные словари для «включения» других стилей. По подсчетам get_MergedDictionaries в одной части нашего приложения, где мало что происходит, было около 10 миллионов обращений. Так что я предполагаю, что мы делаем что-то совершенно не так со словарями ресурсов в целом. Итак, я попытался реорганизовать все, и я хочу попытаться избавиться от всех объединенных словарей.
Теперь к собственному вопросу. Я пытался избавиться от объединенных словаря, но мне это не удалось. Насколько я понимаю, при использовании StaticResource поиск требует, чтобы ресурс был определен до текущего.Я сделал следующий короткий пример:
Один основной проект и одна библиотека пользовательских элементов управления.
Библиотека пользовательских элементов управления содержит 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 и ссылаться на Colors.xaml, но я всегда думал, ну, я никогда не проверял, что ресурсы ищутся в зависимости от логического дерева и ресурсов элемента. Насколько я понимаю; Кнопка создана; попытаться найти шаблон .. найден; попробуйте найти цвет, не найденный на собственных ресурсах, подойдите и используйте ресурсы Windows.
Кажется, я ошибаюсь. Так что я надеюсь, что кто-нибудь сможет пролить свет на это для меня. Мы активно используем WPF, и, несмотря на это, мы многого достигли с его помощью, но из-за некоторого неправильного поведения в начале наша производительность очень низкая только из-за поиска ресурсов. Любая помощь будет принята с благодарностью
Заранее спасибо С наилучшими пожеланиями Нико