How to programmatically respond to Snap in Windows 8 Metro

后端 未结 3 610
心在旅途
心在旅途 2020-12-10 13:33

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 pa

相关标签:
3条回答
  • 2020-12-10 14:17

    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

    0 讨论(0)
  • 2020-12-10 14:21

    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.

    0 讨论(0)
  • 2020-12-10 14:28

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

    0 讨论(0)
提交回复
热议问题