Из того, что я знаю сейчас. Ресурс будет искать MyColor в его текущем xaml, его текущих MergedDictionaries, в Generic.xaml (при некоторых обстоятельствах) и в app.xaml и его MergedDictionaries. Таким образом, это работает отлично. Теперь мы удалили все объединенные словари, объединили множество xmall xamls в один xaml и объединили их все в app.xaml. Таким образом, app.xaml является более или менее единственным файлом, допускающим объединение словарей. Вы должны обратить особое внимание на порядок «включений» в app.xaml, но, помня об этом, он работает гладко.

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

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

Ответы на вопрос(4)

Ваш ответ на вопрос