Управление VisualState в Prism

По работе с Prism при разработке универсальных приложений Windows написано не так много статей, как того хотелось бы. Бывает, что на совершенно обыденные, простые вещи, приходится писать свой "велосипед". Сейчас работая над "Моя посылка" я столкнулся с одной небольшой проблемой решить которую мне помогло только изучение исходных кодов библиотеки Prism.

Для управления VisualState в Prism в обычных случаях можно не писать ни одной строки кода. Все что нужно — это наследовать страницы приложения от Microsoft.Practices.Prism.StoreApps.VisualStateAwarePage. Этот класс уже содержит необходимый метод определения текущего состояния.

protected virtual string DetermineVisualState(double width, double height)
{
    if (width <= MinimalLayoutWidth) 
    { 
        return MinimalLayoutVisualState; 
    } 
    
    if (width < height) 
    { 
        return PortraitLayoutVisualState; 
    } 
    
    return DefaultLayoutVisualState; 
}

Метод  DetermineVisualState вызывается каждый раз, когда изменяется размер окна приложения. По умолчанию MinimalLayoutWidth установлен в 500px, но это значение можно изменить через Package.appxmanifest или указав для конкретной страницы в разметке.

<prism:VisualStateAwarePage
	...
	xmlns:prism="using:Microsoft.Practices.Prism.StoreApps"
        MinimalLayoutWidth="800">

Всего разработчики Prism определили 3 состояния страницы:

  • DefaultLayout - значение по умолчанию, которое принимает страницы в своем нормальном виде и размере.
  • PortraitLayout - портретная ориентация страницы.
  • MinimalLayout - значение, принимаемое при минимальной ширине окна.

Если по какой-то причине необходимо больше состояний, нужно наследовавшись от VisualStateAwarePage переопределить метод DetermineVisualState.

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

<controls:PageHeaderControl DataContext="{Binding PageHeaderControlViewModel}"
	Loaded="StartLayoutUpdates"
	Unloaded="StopLayoutUpdates" />

По событию Loaded мы подписываемся на отслеживание изменений, по событию Unloaded отписываемся от них. Методы StartLayoutUpdates и StopLayoutUpdates реализовывать не нужно, за нас это сделали разработчики Prism.

Комментарии

Оставить комментарий