我试图找出这些LayoutAwarePage如何实际更改页面状态。
当方向改变时,调用了以下处理程序:
this.InvalidateVisualState()
我试图了解调用如何映射到XAML中的右视图状态?即
<!– Visual states reflect the application’s view state –>
<VisualStateGroup x:Name="ApplicationViewStates">
<VisualState x:Name="FullScreenLandscape">
.
.
.
</VisualState>
<VisualState x:Name="Filled">
.
.
.
</VisualState>
<!– The entire page respects the narrower 100-pixel margin convention for portrait –>
<VisualState x:Name="FullScreenPortrait">
.
.
.
</VisualState>
<!– The back button and title have different styles when snapped –>
<VisualState x:Name="Snapped">
.
.
.
</VisualState>
</VisualStateGroup>
无论它做什么显然都能解析VisualStateManager中声明的正确视觉状态。
为什么它会使视觉状态无效而不是仅仅调用VisualStateManager.GoToState(this,"Filled",false)
? InvalidateVisualState还在做什么?
答案 0 :(得分:1)
我认为原因是VisualStateManager直接与windows“events”进行通信。
VisualState名称“Filled”,“Snapped”等是常量。每当用户使用地铁应用程序时,都会应用“Snapped”视觉状态。
因此,当引发窗口事件以指示用户转动其平板电脑或捕获应用程序时,对InvalidateVisualState的调用只会告诉VisualStateManager其当前状态可能是错误的,并且需要重新计算/刷新它。 确定新状态(即当前的城域应用程序状态是什么?),当确定此状态时,将应用匹配的VisualState。
这就是为什么在调用自定义视觉状态时只需要VisualStateManager.GoToState(this,“Custom”,false),这意味着一个没有内置的状态。
我不保证这实际上是如何工作的,但这是我理解VisualStateManager行为的方式。至少对于Metro应用程序。