How to programmatically respond to Snap in Windows 8 Metro

13,434

Solution 1

In Consumer Preview you need to react to a different event. It's ViewStateChanged now, not LayoutChanged.

Solution 2

In Release Preview you need to react to a different event, again :) It's SizeChanged now, not ViewStateChanged.

Previously, your app would do something like this to handle view state changes:

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; 
}

Now apps should do this:

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;
}

More info here

Solution 3

Jowen had the answer, I'm just adding some more to the WindowSizeChanged code here:

    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");
    }

What I find a little surprising is that when I copied this placeholder code to another page, it gives the code a bounded rectangle and, since I did not have "using Windows.UI.ViewManagement;" yet, when I hovered over the unrecognized code, it asked "Import the file for the pasted code?" I guess it (I don't know if "it" is VS or Resharper) is keeping track of code that has pasted in, as it may be viewed with a rakishly angled or akimbo eyebrow.

Share:
13,434
Igor Kulman
Author by

Igor Kulman

Software Engineer building great mobile apps since 2011, currently for the iOS platform using Swift. Leading the development of the new completely native Teamwire secure messaging iOS app used by enterprise and government customers like the Bavarian Police.

Updated on June 09, 2022

Comments

  • Igor Kulman
    Igor Kulman almost 2 years

    Is there a way to respond to Snap in C# in a Metro app? When one of the pages is snapped I need to show another one. My idea is to respond to snap by naviating to another page.

    I found

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

    but it looks like it no longer works in Consumer Preview. Is there another way?