WPF Performance Загрузка пользовательских элементов управления - PullRequest
3 голосов
/ 14 июля 2011

Я работаю над приложением WPF с интерфейсом MDI с вкладками.По сути, пользователь щелкает пункт меню, и это создает и добавляет новую вкладку.Новый «MyUserControl» создается и устанавливается в качестве содержимого вкладки.Примерно так:

    private void MenuItem_OnClick(object sender, RoutedEventArgs e)
    {
        this.TabControl.Items.Add(new TabItem() { Content = new MyUserControl() });
    }

MyUserControl состоит из нескольких вложенных элементов управления (около 8 элементов управления).Когда этот подход привязан к фактическому контролю, производительность неприемлема.

Если я не схожу с ума, я заметил, что при объявлении вкладки и контента в представлении производительности наблюдается гораздо меньше.xaml заранее и просто переключите свойство Visibility элемента вкладки:

    <Controls:TabControl x:Name="TabControl" Grid.Row="1">
        <Controls:TabControl.Items>
            <Controls:TabItem x:Name="MyTabItem" Visibility="Collapsed">
                <Controls:MyUserControl x:Name="MyUserControl" />
            </Controls:TabItem>
        </Controls:TabControl.Items>
    </Controls:TabControl>

и

    private void MenuItem_OnClick(object sender, RoutedEventArgs e)
    {
        this.MyTabItem.Visibility = Visibility.Visible;
    }

Кто-нибудь может объяснить это?Действительно ли более эффективно создавать «визуальное дерево» в xaml, а не программно?Или прирост производительности во втором подходе был перенесен на общую загрузку формы вместо того, чтобы щелкать по пункту меню, как при первом подходе?

Второй подход определенно работает намного лучше.Есть мысли?

Ответы [ 2 ]

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

Не эффективнее объявить это xaml.Я думаю, вы правы, считая, что снижение производительности было перенесено в загрузку формы.

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

В противном случае, если проблема заключается только в количестве элементов управления в пользовательском элементе управления, возможно, вы можете сохранить полностью загруженную вкладку в памяти доготов к использованию.Как только пользователь щелкнет по пункту меню, добавьте его в tabcontrol, а затем начните загрузку нового в фоновом потоке.

0 голосов
/ 14 июля 2011

Да, вы перенесли удар по производительности в инициализацию окна.Даже свернувшись, экземпляр UserControl был создан - вы явно добавили его в TabControl.Открытие тега в xaml - это то же самое, что сказать new.Свернутые элементы управления должны создаваться, потому что даже если вы не видите их или не взаимодействуете с ними на экране, другие элементы управления могут иметь привязки к нему, а выделенный код может работать с экземпляром.

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

...