Когда я должен использовать 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 должно подойти. Если вы пишете игру, не так много. Аналогично, если вы делаете что-то вроде интерактивной рекламы или медиаплеера.

Другие вопросы по тегам