Когда мне следует использовать UserControl вместо Page?

Я заметил, что многие из фреймворков WPF MVVM, похоже, избегают использования элементов управления NavigationWindow и Page в пользу создания страниц с использованием вложенных элементов управления UserControl.

NavigationWindow и Page предоставляют простые способы включения навигации вперед и назад в журнале, а также предоставляют простой способ передачи данных между страницами. Большинство фреймворков MVVM, которые я видел, повторно реализуют эти функции различными способами.

Есть ли конкретная причина избегать использования NavigationWindow и Page?


person dthrasher    schedule 12.04.2010    source источник


Ответы (4)


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

http://msdn.microsoft.com/en-us/library/system.windows.navigation.navigationwindow.aspx

person jasonk    schedule 12.04.2010
comment
Хороший улов. Так что, возможно, классы NavigationWindow и Page менее актуальны для типичного бизнес-приложения. Хотя меня все еще удивляет, что многие фреймворки MVVM полностью их избегают. - person dthrasher; 19.04.2010

Я только что обнаружил еще одно различие между UserControls и Pages: страницы нельзя использовать в качестве шаблонов данных.

Например, если вы создавали приложение в стиле MVVM, вы могли ожидать, что это сработает:

    <DataTemplate DataType="{x:Type ViewModels:ProjectDashboardViewModel}">
        <Views:ProjectDashboardView />
    </DataTemplate>

Но если ProjectDashboardView является страницей, это не удастся.

person dthrasher    schedule 17.06.2010
comment
В этом сценарии вы хотите, чтобы ваша страница либо принимала модель представления в конструкторе, либо создавала ее из других данных. Как правило, реализации MVVM хотели бы использовать функцию PageFunction ‹T›. Внутри вашей страницы у вас может быть презентация контента, содержащая модель представления. Страница является компонентом верхнего уровня. Попробуйте представить его как встроенное окно. - person Gusdor; 28.05.2013

Я только что нашел другую интересную информацию, связанную с WPF NavigationWindow и Page на веб-сайте Пола Стовелла.

Он сказал следующее о классе NavigationWindow:

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

См. Его подробную статью о WPF Navigation и Проблемы с управлением страницами Magellan и WPF, с которыми он столкнулся при написании своей платформы Magellan WPF.

person dthrasher    schedule 20.04.2010

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

person Doobi    schedule 12.04.2010