处理通用应用程序视图状态的最佳方式

本文关键字:最佳 方式 视图状态 应用程序 处理 | 更新日期: 2023-09-27 18:21:07

捕捉视图状态更改并在每个状态下修改应用程序行为的最佳方法是什么?我整个上午都在寻找好的教程或建议,我刚刚找到了使用VisualStateManager的好教程。这对我来说真的很有帮助,但VisualStudio说,这种方法已经过时了。这种方式也不适用于某些功能,那么如何在Windows 8.1通用应用程序中高效有效地修改四种状态(横向、填充、捕捉、纵向)的用户界面呢?

处理通用应用程序视图状态的最佳方式

windows 8.1中没有ApplicationViewState枚举。然而,方法是相同的:在SizeChanged事件处理程序中使用可视化状态和VisualStateManager。

阅读此博客文章:http://marcominerva.wordpress.com/2013/10/16/handling-visualstate-in-windows-8-1-store-apps/

它描述了如何在windows 8.1 中确定当前视觉状态

在Windows8中,一个页面有4种预定义的视图状态,Snapped、Filled、FullScreenLandscape和FullScreenPortrait。要知道视图状态,您必须使用ApplicationView.Value返回4个状态之一,然后您必须调用VisualStateManager.GtoState(),将状态名称作为参数传递。

现在,在windows 8.1中没有预定义的视图状态,ApplicationView的value属性已被弃用。现在窗口的大小更加灵活,用户可以在多应用程序模式下调整应用程序占用的空间宽度,因此窗口设计的决策必须根据容纳应用程序的窗口的大小。当事件SizeChanged被触发时,应该使用ApplicationView.GetForCurrentView调用当前窗口信息,这个函数返回一个ApplicacionView,我们可以使用Orientation、IsFullScreen、AdjacentToLeftDisplayEdge、Adjacent ToRightDisplayEdge等属性来做出决定,也有必要确定窗口的大小。

要找到屏幕的宽度,有两种方法。

我们可以访问WindowSize事件的WindowSizeChangedEventArgs类型的参数,然后调用e.Size.Width.

我们也可以使用Window.Current.Bounds来了解窗口的大小。

我们还必须更新OnNavigatedTo方法页面中窗口的设计,因为当你按下按钮时,不会触发SizeChanged事件,如果当前分辨率与加载前一页时的分辨率不同,那么VisualState就不合适了。

我留下一个可能的解决方案的例子

public class MainPage:Page
{
    public MainPage()
    {
        this.Loaded += page_Loaded;
        this.Unloaded += page_Unloaded;
    }
    private void page_Loaded(object sender, RoutedEventArgs e)
    {
        Window.Current.SizeChanged += Window_SizeChanged;
    }
    private void page_Unloaded(object sender, RoutedEventArgs e)
    {
        Window.Current.SizeChanged -= Window_SizeChanged;
    }
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        UpdateVisualState();
    }
    private void Window_SizeChanged(object sender, WindowSizeChangedEventArgs e)
    {
        UpdateVisualState();
    }
    private void UpdateVisualState()
    {
        var visualState = string.Empty;
        var applicationView = ApplicationView.GetForCurrentView();
        if (applicationView.IsFullScreen)
        {
            if (applicationView.Orientation == ApplicationViewOrientation.Landscape)
                visualState = "FullScreenLandscape";
            else
                visualState = "FullScreenPortrait";
        }
        else
        {
            var size = Window.Current.Bounds;
            if (size.Width == 320)
                visualState = "Snapped";
            else if (size.Width <= 500)
                visualState = "Narrow";
            else
                visualState = "Filled";
        }
        VisualStateManager.GoToState(this, visualState, true);
    }
}