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