处理通用应用程序状态的最佳方法

时间:2014-09-07 08:49:25

标签: c# wpf xaml windows-8.1 win-universal-app

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

2 个答案:

答案 0 :(得分:3)

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

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

它描述了如何在Windows 8.1中确定当前的可视状态

答案 1 :(得分:1)

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

现在在Windows 8.1中没有预定义的视图状态,并且不推荐使用ApplicationView的value属性。现在窗口大小更流畅,用户可以在多应用程序模式下调整应用程序占用空间的宽度,因此窗口设计的决定必须根据保存应用程序的窗口的大小来确定。 当触发事件SizeChanged时,应使用ApplicationView.GetForCurrentView调用当前窗口信息,此函数返回一个ApplicacionView,我们可以使用Orientation,IsFullScreen,AdjacentToLeftDisplayEdge,AdjacentToRightDisplayEdge等属性做出决策,也是确定窗口大小所必需的。 / p>

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

我们可以访问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);
    }
}