2012-06-11 56 views
8

可以說我在每個單元格內有一個2行,2列和許多控件的網格。如何檢測方向更改和更改佈局?

當應用程序更改爲快照模式時,我的意思是1/3的屏幕我希望應用程序只有一列,2行,並且只顯示我決定的一些控件。

我對此有什麼樣的控制?

THX

回答

8

你應該利用VisualStateManager的XAML中,一個完整的解決方案的XAML:

<Grid x:Name="LayoutRoot"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="OrientationStates"> 
      <VisualState x:Name="Full"/> 
      <VisualState x:Name="Fill"/> 
      <VisualState x:Name="Portrait"/> 
      <VisualState x:Name="Snapped"/> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
</Grid> 

創建每個的VisualState和隱藏/顯示元素在你的XAML的故事板。 Microsoft示例使用相同的解決方案。

-

更新

我搜索網,發現正確的狀態,一個例子是此鏈接背後:MSDN

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="ApplicationViewStates"> 
     <VisualState x:Name="FullScreenLandscape"/> 
     <VisualState x:Name="Filled"/> 
     <VisualState x:Name="FullScreenPortrait"/> 
     <VisualState x:Name="Snapped"/> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

這些州反映了ApplicationViewState枚舉。更多的信息可以在here找到。

+0

能否請您詳細說明您的答案更多?,在您的幫助下,我可以獲得此鏈接,http://www.markermetro.com/2011/11/technical/windows-8-metro-style-apps-layout-and-orientation-management-with- xaml /,所以這意味着我必須爲每個可視狀態編寫不同的佈局,並根據狀態將每個方向更改的數據重新綁定到正確的控件? –

+0

是的!這確實是最好的,只有xaml,解決方案afaik。你可以用一些聰明的故事板重用你的一些元素,但你大多需要創建不同的佈局。如果你這樣做,將它們轉移到單獨的用戶控件或視圖幷包含它們可能是明智的。 – Kolky

+0

對不起,我有點狹隘。微軟創建了一個支持這些VisualState的基本頁面類。我用一個更有用的例子更新了我的文章... – Kolky

9

使用DisplayProperties.OrientationChanged事件(由@Jan K.所建議的)可能不正是你所尋找的,考慮的註釋部分到此事件:

DisplayProperties.OrientationChanged事件時纔會發生顯示器或顯示器的方向發生變化,而不一定在應用程序的方向發生變化時。要確定您的應用程序的佈局目的方向,請使用ApplicationView.Value屬性。

但由於ApplicationView.Value可能會後的Windows 8.1發佈 MS建議使用ApplicationView.GetForCurrentView(拋棄)代替:

ApplicationView靜態方法可以Windows後更改或不可用的版本8.1預覽。而是使用ApplicationView.GetForCurrentView()來獲取ApplicationView的一個實例。

所以現在我已經結束了與代碼(有一種動態的觀點,並且無法通過VisualStateManager在XAML預先設計的一切,不幸):

public MainPage() 
{ 
    InitializeComponent(); 
    Window.Current.SizeChanged += (sender, args) => 
    { 
     ApplicationView currentView = ApplicationView.GetForCurrentView(); 

     if (currentView.Orientation == ApplicationViewOrientation.Landscape) 
     { 
      // when args.Size.Width > args.Size.Height 
     } 
     else if (currentView.Orientation == ApplicationViewOrientation.Portrait) 
     { 
      // when args.Size.Width < args.Size.Height 
     } 
    }; 
}