Когда я должен использовать UserControl вместо Page?
Я заметил, что многие из инфраструктур WPF MVVM, по-видимому, избегают использования элементов управления NavigationWindow и Page в пользу создания страниц с использованием вложенных элементов UserControls.
NavigationWindow и Page предоставляют простые способы включить навигацию вперед и назад в журнале, а также обеспечивают простой способ передачи данных между страницами. Большинство платформ MVVM, которые я видел, реализуют эти функции различными способами.
Есть ли конкретная причина избегать использования NavigationWindow и Page?
4 ответа
"NavigationWindow не сохраняет экземпляр объекта контента в истории навигации. Вместо этого NavigationWindow создает новый экземпляр объекта контента каждый раз, когда к нему перемещаются с использованием истории навигации. Это поведение призвано избежать чрезмерного потребления памяти при больших числах и к большим частям контента осуществляется навигация. Следовательно, состояние контента не запоминается при переходе от одной навигации к другой, однако в WPF предусмотрено несколько методов, с помощью которых вы можете сохранить часть состояния для части контента в истории навигации...."
http://msdn.microsoft.com/en-us/library/system.windows.navigation.navigationwindow.aspx
Я только что обнаружил другое различие между UserControls и Pages: страницы не могут быть использованы в качестве шаблонов данных.
Например, если вы создавали приложение с использованием стиля MVVM, вы можете ожидать, что это сработает:
<DataTemplate DataType="{x:Type ViewModels:ProjectDashboardViewModel}">
<Views:ProjectDashboardView />
</DataTemplate>
Но если ProjectDashboardView - это страница, он потерпит неудачу.
Я только что нашел некоторую другую интересную информацию, связанную с WPF NavigationWindow и Page на веб-сайте Пола Стовелла.
У него есть это, чтобы сказать о классе NavigationWindow:
WPF включает в себя класс NavigationWindow, который по сути является окном, которое также удваивается как фрейм, реализуя большинство из тех же интерфейсов. Поначалу это звучит полезно, но в большинстве случаев вам нужен больший контроль над окном, поэтому у меня никогда не было необходимости использовать этот класс. Я просто указываю на это для полноты картины, хотя ваш пробег может отличаться.
См. Его углубленную статью о навигации WPF и проблемах управления страницами Magellan и WPF, с которыми он столкнулся при написании своей среды Magellan WPF.
Что ж, вы все еще собираетесь использовать пользовательские элементы управления для создания многократно используемых подкомпонентов, но что касается архитектуры приложений, то в действительности все сводится к случаю использования. Если вы создаете типичное веб-приложение, приложение Business/Navigation должно подойти. Если вы пишете игру, не так много. Аналогично, если вы делаете что-то вроде интерактивной рекламы или медиаплеера.