11

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?

Filip Skakun
  • 31,624
  • 6
  • 74
  • 100
Igor Kulman
  • 16,211
  • 10
  • 57
  • 118

3 Answers3

24

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

Jowen
  • 5,203
  • 1
  • 43
  • 41
9

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.

B. Clay Shannon-B. Crow Raven
  • 8,547
  • 144
  • 472
  • 862
5

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

Kate Gregory
  • 18,808
  • 8
  • 56
  • 85
  • 6
    This answer is outdated. Check out my post below for Release Preview – Jowen Jun 14 '12 at 11:57
  • 1
    to be fair, it is not wrong FOR CONSUMER PREVIEW which is the first three words of the answer. It is not right for the current version, but that's not the same as being wrong. – Kate Gregory Oct 15 '13 at 16:04