2012-06-11 12 views
8

私は2行、2列、各セルの中に多くのコントロールを持つグリッドを持っていると言うことができます。オリエンテーションの変化を検出してレイアウトを変更する方法は?

アプリケーションがスナップモードに変更されたとき、アプリケーションを1列、2行、表示する画面の1/3を意味していました。

どのような種類のコントロールがありますか?

答えて

8

あなたは完全なXAMLのソリューションのために、XAMLでVisualStateManagerを利用する必要があります。

<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で見つけることができます。 DisplayProperties.OrientationChangedイベントを使用して

+0

あなたは手の込んだしてくださいすることができますあなたの答えは?、あなたの助けを借りて私はこのリンクを得ることができました。http://www.markermetro.com/2011/11/technical/windows-8-metro-style-apps-layout-and-orientation-management-with- xaml /のように、各ビジュアル状態ごとに異なるレイアウトを作成し、各方向のデータを状態に応じて正しいコントロールに再バインドする必要があります。 –

+0

はい!それは確かに最高の、xamlのみ、ソリューションafaikになります。あなたはいくつかの巧妙なストーリーボードでいくつかの要素を再利用することができますが、主に異なるレイアウトを作成する必要があります。そうした場合、それらを分離してUserControlsまたはViewsに移動し、それらを含めることが賢明かもしれません。 – Kolky

+0

申し訳ありませんが、私はちょっと狭いです。 Microsoftは、これらのVisualStatesをサポートする基本ページクラスを作成しました。より有用な例で自分の投稿を更新しました... – Kolky

8

THXはDisplayProperties.OrientationChanged - イベントの表情を持っています。それが発生すると、グリッドを変更してコントロールを再配置できます。

9

は(@Jan K.により示唆されるように)、このイベントへの発言部分を考慮すると、あなたが探しているまさにではないかもしれない:

DisplayProperties.OrientationChangedイベントが場合にのみ発生しますディスプレイやモニタの向きが変わります。アプリの向きが変わっても必ずしもそうではありません。レイアウト目的でアプリケーションの向きを決定するには、ApplicationView.Valueプロパティを使用します。

しかしApplicationView.ValueはおそらくのWindows 8.1リリースMSの後に放棄されますので、代わりにApplicationView.GetForCurrentView()を使用することをお勧め:

静的メソッドは、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 
     } 
    }; 
} 
関連する問題