什么在LayoutAwarePage中调用“GoToState()”?

时间:2013-06-24 21:47:01

标签: c# .net xaml windows-runtime winrt-xaml

我试图找出这些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还在做什么?

1 个答案:

答案 0 :(得分:1)

我认为原因是VisualStateManager直接与windows“events”进行通信。

VisualState名称“Filled”,“Snapped”等是常量。每当用户使用地铁应用程序时,都会应用“Snapped”视觉状态。

因此,当引发窗口事件以指示用户转动其平板电脑或捕获应用程序时,对InvalidateVisualState的调用只会告诉VisualStateManager其当前状态可能是错误的,并且需要重新计算/刷新它。 确定新状态(即当前的城域应用程序状态是什么?),当确定此状态时,将应用匹配的VisualState。

这就是为什么在调用自定义视觉状态时只需要VisualStateManager.GoToState(this,“Custom”,false),这意味着一个没有内置的状态。

我不保证这实际上是如何工作的,但这是我理解VisualStateManager行为的方式。至少对于Metro应用程序。