MergedDictionaries и поиск ресурсов

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

Заранее спасибо С наилучшими пожеланиями Нико

21
задан dowhilefor 14 July 2011 в 12:44
поделиться