Как программно реагировать на Snap в Windows 8 Metro

Есть ли способ ответить на Snap в C# в приложении Metro? Когда одна из страниц закрывается, мне нужно показать другую. Моя идея состоит в том, чтобы ответить на привязку, перейдя на другую страницу.

я нашел

var currentView = ApplicationLayout.GetForCurrentView();
currentView.LayoutChanged += new TypedEventHandler<ApplicationLayout, ApplicationLayoutChangedEventArgs>(currentView_LayoutChanged);

но похоже, что он больше не работает в Consumer Preview. Есть ли другой способ?


person Igor Kulman    schedule 28.04.2012    source источник
comment
Это хорошо описано в примере Snap: code.msdn.microsoft.com/windowsapps /Snap-Sample-2dc21ee3   -  person Hans Passant    schedule 28.04.2012
comment
Принятый ответ устарел на момент выпуска Release Preview.   -  person Jim McKeeth    schedule 03.07.2012


Ответы (3)


В Consumer Preview вам нужно реагировать на другое событие. Теперь это ViewStateChanged, а не LayoutChanged.

person Kate Gregory    schedule 28.04.2012
comment
Этот ответ устарел. Проверьте мой пост ниже для предварительного просмотра релиза - person Jowen; 14.06.2012
comment
чтобы быть справедливым, это правильно ДЛЯ ПОТРЕБИТЕЛЬСКОГО ПРЕДПРОСМОТРА, который является первыми тремя словами ответа. Это неправильно для текущей версии, но это не то же самое, что неправильно. - person Kate Gregory; 15.10.2013

В Release Preview вам снова нужно реагировать на другое событие :) Теперь это SizeChanged, а не ViewStateChanged.

Раньше ваше приложение делало что-то подобное для обработки изменений состояния просмотра:

using Windows.UI.ViewManagement;

// Register for the viewstatechanged event
ApplicationView.GetForCurrentView().ViewStateChanged += ViewStateChanged;    

private void ViewStateChanged(ApplicationView sender, ApplicationViewStateChangedEventArgs e)
{
     // Obtain view state from event payload
     ApplicationViewState myViewState = e.ViewState; 
}

Теперь приложения должны делать это:

using Windows.UI.ViewManagement;

// Register for the window resize event
Window.Current.SizeChanged += WindowSizeChanged;     

private void WindowSizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e)
{
    // Obtain view state by explicitly querying for it
    ApplicationViewState myViewState = ApplicationView.Value;
}

Подробнее здесь

person Jowen    schedule 14.06.2012

У Джоуэна был ответ, я просто добавляю сюда код WindowSizeChanged:

    ApplicationViewState viewState = ApplicationView.Value;
    if (viewState == ApplicationViewState.Filled)
    {
        System.Diagnostics.Debug.WriteLine("viewState is Filled");
    }
    else if (viewState == ApplicationViewState.FullScreenLandscape)
    {
        System.Diagnostics.Debug.WriteLine("viewState is FullScreenLandscape");
    }
    else if (viewState == ApplicationViewState.Snapped)
    {
        System.Diagnostics.Debug.WriteLine("viewState is Snapped");
    }
    else if (viewState == ApplicationViewState.FullScreenPortrait)
    {
        System.Diagnostics.Debug.WriteLine("viewState is FullScreenPortrait");
    }
    else
    {
        System.Diagnostics.Debug.WriteLine("viewState is something unexpected");
    }

Что меня немного удивляет, так это то, что когда я копировал этот код-заполнитель на другую страницу, он давал коду ограниченный прямоугольник и, поскольку у меня не было "using Windows.UI.ViewManagement;" тем не менее, когда я навел курсор на нераспознанный код, он спросил: «Импортировать файл для вставленного кода?» Я предполагаю, что это (я не знаю, является ли «это» VS или Resharper) отслеживает вставленный код, поскольку его можно просматривать с лихо изогнутой или подбоченившейся бровью.

person B. Clay Shannon    schedule 07.11.2012
comment
Правда, это было бы предпочтительнее. - person B. Clay Shannon; 24.07.2013
comment
«ApplicationViewState может быть изменен или недоступен для выпусков после Windows 8.1. Вместо этого запрашивайте размеры макета окна напрямую». ОПЯТЬ УСТАРЕЛО. - person Jawahar; 16.07.2015