У меня проблема с ресурсными словарями и сложенными словарями в целом, особенно когда речь идет о производительности ресурса. После некоторого тестирования производительности я обнаружил, что 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, но я всегда думал, что я никогда не проверял, что ресурсы просматриваются в зависимости от логического дерева и ресурсов элемента. Мое понимание; Создается кнопка; попробуйте найти шаблон.. found; попробуйте найти цвет, не найти на собственных ресурсах, подойти и использовать ресурсы Windows.
Кажется, я ошибаюсь. Поэтому я надеюсь, что кто-то может пролить свет на это для меня. Мы активно используем WPF, и, несмотря на это, мы многого добились с ним, но из-за неправильного обучения в начале, наша производительность довольно плохая только из-за поиска ресурсов. Любая помощь будет принята с благодарностью
Спасибо заранее С наилучшими пожеланиями Нико