在 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 等属性来做出决定,也需要确定窗口的大小。
要找到屏幕的宽度有两种方法。
我们可以访问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);
}
}