почему быстрее поместить ресурсы в мой файл APP.xaml, а не в MyClass.xaml в WPF? - PullRequest
2 голосов
/ 14 июня 2011

вот в чем дело:

У меня есть проект, в котором настроены мои меню / ContextMenu / MenuItems.

так что в основном у меня есть пара файлов MyMenuItem.xaml / MyMenuItem.xaml.cs с моим файлом MyMenuItem.xaml, содержащим некоторые ресурсы + стиль и шаблон.

проблема: моему contextMenu (довольно большому, я признаю, но все же ...) потребовалось около 14 секунд для загрузки (!!)

Я сделал некоторое профилирование и обнаружил, что эта строка: MyMenuItem item = new MyMenuItem(); заняла 65% UC за эти 14 секунд. Поэтому я попытался избавиться от своих стилей, шаблонов и ресурсов в MyMenuItem.xaml и, действительно, мне потребовалось 0,3 секунды, чтобы загрузить меню. Затем я поместил эти стили / шаблоны в App.xaml, и мне удалось получить дизайн, как я хотел, но с ожидаемой производительностью.

мой вопрос: как получилось?

почему я не могу поместить стили menuItem в мой файл MyMenuItem.xaml, и мне нужно поместить их в App.xaml, чтобы получить хорошие результаты? что здесь происходит, чем я не понимаю?

продвигаясь дальше по этому пути, я делаю вывод, что все мои другие стили для других моих элементов управления могут фактически иметь ту же проблему, поэтому тогда я должен затем поместить все свои шаблоны / стили в App.xaml, что в некотором роде противоречит цели имея для каждого элемента управления пару .xaml / .xaml.cs

что я здесь упускаю / делаю неправильно?

edit: на всякий случай, вот макет моего файла MyMenuItem.xaml:

<MyMenuItem ...>
    <MyMenuItem.Resources>
        <Style x:Key="Style1" />
        <Style x:Key="Style2" />
        <Style x:Key="Style3" />
    </MyMenuItem.Resources>
    <MyMenuItem.Style>
        <Style TargetType="MenuItem">
            <Setter Property=Template>
                 <Setter.Value>
                     <ControlTemplate TargetType="MenuItem">

                     <!--here I'm using Styles 1,2 and 3-->

                     </ControlTemplate>
            </Setter.Value>
            </Setter>
        </Style>
    </MyMenuItem.Style>
</MyMenuItem>

и проблема во всем, включая MyMenuItem.Resources (т.е. стили 1,2 и 3)

1 Ответ

1 голос
/ 14 июня 2011

Если вы объявите свои ресурсы на уровне меню, эти ресурсы будут созданы для каждого экземпляра меню . Объявите это на уровне приложения, и один экземпляр ресурсов будет создан и доступен для всех меню. По сути, вы хотите переместить ресурсы настолько далеко вверх по логическому дереву, насколько это имеет смысл, чтобы максимизировать совместное использование этих ресурсов.

Тем не менее, 14-е звуки звучат чрезмерно, поэтому я могу только предположить, что у вас там есть довольно тяжелые ресурсы.

...