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