2012-04-03 2 views
2

Я создаю ресурсоемкое приложение панели мониторинга, которое будет обладать многими областями визуализации данных. Я думаю, что было бы лучше использовать фрейм и загружать страницы, необходимые по одному за раз, используя страницы WPF. На этих страницах также будут разные контексты данных, ограничения безопасности и т. Д. Но другой разработчик говорит, что я могу выполнить то же самое, используя TabControl.WPF TabControl vs. Pages

Включает ли TabControl все элементы на всех вкладках сразу при запуске приложения? Или я могу загрузить их лениво по мере необходимости, как с WPF-страницами (страница загружает контент только при навигации)? Кроме того, у вас есть разные контексты данных для каждого элемента в TabControl?

ответ

2

В WPF вы можете использовать виртуализацию пользовательского интерфейса, что означает, что только визуальные элементы управления инициализируются и визуализируются. Насколько мне известно, TabControl по умолчанию не поддерживает виртуализацию пользовательского интерфейса, но, возможно, вы можете добавить его вручную или использовать другой элемент управления. Возможно, вы хотите взглянуть на следующее article, в котором представлены некоторые рекомендации по производительности. Также упоминается, что существует различие между пользовательским интерфейсом и виртуализацией данных. Не показывать элементы управления не означает, что базовые данные не находятся в памяти. Все ваши целевые объекты будут загружены, но элементы управления не будут отображаться.

К вашему второму вопросу: Да, каждый TabItem может иметь свои собственные DataContext. Если вы используете TabControls ItemsSource для привязки списка элементов, то DataContext для каждого TabItem будет одним из элементов списка. Если вручную добавить TabItems, вы можете установить DataContext вроде:

<TabControl> 
    <TabItem DataContext="{Binding Context1}" /> 
    <TabItem DataContext="{Binding Context2}" /> 
</TabControl> 
1

Это гораздо сложнее, чем вы бы догадаться. Если вы привязываетесь к коллекции вкладок (думаю, MVVM), тогда вкладка создается только при ее выборе. И с коллекцией, если вы оставите вкладку и вернетесь, она будет построена СНОВА. Если вы создаете вкладки в XAML, то вкладки все построены, когда загружаются окна. Да, для каждой вкладки вы можете иметь разные DataContext. То, что я делаю для ленивых загрузок, связано с свойством TabItem IsSelected, и если оно ложно, все свойства класса возвращают (быстрый) статический тип. Если IsSelected изменен на true, я загружаю реальные значения и вызываю NotifyPropertyChanged (и сохраняю реальные значения).

Я использую heck из этого, если я загружаю большие объекты, а одна вкладка - сводка. Вкладки не виртуализируются, но если у вас большие списки, то наверняка используйте виртуализацию на вкладке. Вы можете использовать BackgroundWorker для создания свойств, но как только он вернется и вы привяжете это возвращаемое значение, пользовательский интерфейс заблокирован до тех пор, пока не будет отображен элемент управления пользовательского интерфейса. Для меня повторное использование одного кадра в сравнении с вкладками - это пользовательский интерфейс. Чтобы разбить код, я обычно загружаю вкладку с фреймом и страницей (и я обычно передаю данные на страницу в ctor для загрузки динамического содержимого).