2013-05-10 11 views
5

私は数年間Androidアプリケーションを書いていますが、今はWindows Store/Windows 8アプリケーションを開発しています。Windows 8ストアアプリケーションの開発中にさまざまな向きを扱う

私は、風景と肖像画の向きに異なる画面レイアウトを書き込む方法について非常に混乱しています。

Androidでは、ファイル名のいくつかの命名規則に従い、2つのレイアウトを縦書き用と横書き用に書き出す必要があります。デバイスを回転させると、プラットフォームによって画面レイアウトが自動的に変更されます。

私はWindows 8アプリケーションで同じことを行うためのいくつかのソリューションを探していました。私は、Visual State GroupsとVisual Statesを使用して解決策を見つけました。同じXAMLをいくつか変更しました。ウィジェットを回転させると例えば

、私は縦方向にデバイスを回転させたときにテキストブロックがその位置を変更するには:

<VisualState x:Name="FullScreenPortrait" > 
    <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Grid.ColumnSpan)" Storyboard.TargetName="GridViewTitle"> 
      <DiscreteObjectKeyFrame KeyTime="0"> 
       <DiscreteObjectKeyFrame.Value> 
        <x:Int32>3</x:Int32> 
       </DiscreteObjectKeyFrame.Value> 
      </DiscreteObjectKeyFrame> 
     </ObjectAnimationUsingKeyFrames> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" Storyboard.TargetName="GridViewTitle"> 
      <DiscreteObjectKeyFrame KeyTime="0"> 
       <DiscreteObjectKeyFrame.Value> 
        <Thickness>0,10,10,807</Thickness> 
       </DiscreteObjectKeyFrame.Value> 
      </DiscreteObjectKeyFrame> 
     </ObjectAnimationUsingKeyFrames> 
    </Storyboard> 
</VisualState> 

それは私にとって非常にクリーンでシンプルに見える、とさえVisual Studioの者を使用していることをやっていませんウィジェットをドラッグ&ドロップしてコードを生成するアプローチ私がやっていることよりも簡単で洗練されたソリューションが必要であるという印象があります。

私の質問は、XAMLレイアウトを各方向に書き込む方が簡単かどうかですか?

ありがとうございます!

答えて

2

異なる向きを扱う1つの方法は、その子を内側にして2つのグリッド要素を作成し、向きに応じてグリッドの視認性を変更することです。

向きの変化を検出するために、あなたはまた、以下のコードのようにSimpleOrientationセンサーを使用することができます。

public sealed partial class MainPage : Page 
    { 
     private SimpleOrientationSensor _oSensor; 

     public MainPage() 
     { 
      this.InitializeComponent(); 

      _oSensor = SimpleOrientationSensor.GetDefault(); 

     } 

     protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 
      if (_oSensor != null) 
       _oSensor.OrientationChanged += (s, a) => 
       { 
        Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
        { 
         switch (a.Orientation) 
         { 
          case SimpleOrientation.NotRotated: 
          case SimpleOrientation.Rotated180DegreesCounterclockwise: 
           currentOrientation.Text = "Landscape"; 
           break; 
          case SimpleOrientation.Rotated270DegreesCounterclockwise: 
          case SimpleOrientation.Rotated90DegreesCounterclockwise: 
           currentOrientation.Text = "Portrait"; 
           break; 
          default: 
           currentOrientation.Text = "N/A"; 
           break; 
         } 
        }); 
       }; 
     } 

    } 

それとも最も簡単な方法は、以下のコードのようなSizeChangedイベントを処理することです:

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 

     mainGrid.SizeChanged += mainGrid_SizeChanged; 
    } 

    void mainGrid_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     if (mainGrid.ActualHeight > mainGrid.ActualWidth) 
      currentOrientation.Text = "Portrait"; 
     else 
      currentOrientation.Text = "Landscape"; 
    } 

} 

・ホープ、この助けて!

+0

うーん。それはいいようですが、私のコードでは、いくつかのグリッドビューの選択されたコンテンツを処理する必要があるので、 'if(portrait){handle_my_gridview_portrait(); } else {ハンドル_my_gridview_landscape(); } '。とにかく、私の現在のソリューションよりも優れています。ありがとう! –

+0

上記のサンプルは、姿勢の変化をさまざまに検出する方法を示しています。ただし、DataContextの値を変更してBindingを使用すると、コードビハインドも回避できます。 – kimsk

+0

この質問に対する両方の回答は良好でしたが、私の問題はあなたの方が適切でした。ありがとう、遅れてごめんなさい! –

1

エスドラス - あなたは間違いがないでしょう、もっと簡単な方法があるはずですが、唯一の他の選択肢は、ソフトウェアExpression Blendです。そして、私は立ち上がるために学習曲線があることを認めます。

Xamlで記述された方向変更についても、親コントロールは、拡張可能(内部シールされていないコントロール)からドライブする必要があり、レイアウトに対応する必要があります。たとえば、レイアウト認識ページにテキストボックスを置くと、向きが変わりますが、レイアウト認識ページとグリッドのテキストボックスにグリッドを置くと、デフォルトの動作ではグリッドは応答しますが、テキストボックスは表示されません。

また、すべてのコントロールがオリエンテーションの変更に応答する必要がある各要素に提供されるようなコントロール修飾子を必要とすることに気付くかもしれません...利点は、状態または遷移を定義するためのネイティブコードが必要ないということですデザイナーは、xamlというxmlの外観を使用して、方向や他のコントロールの状態にかかわらず、ビューの変更を記述することができます。

Expression Blendプログラムを手に入れることができれば、それはその目的のために作られたものです。

+2

ここでの簡単な説明:ここでのコンテキストはWindows 8ですので、Blendは既にVisual Studio 2012の「ボックス内」です –

0

私はあなたのために役立つかもしれないいくつかの時間が戻ってstackoverflowに投稿を書いている。 いくつかの例とコードを提供:[Windows 8のアプリの上の取扱いオリエンテーション]

[1] Handling Orientation in Windows 8.1 Store app

ポスト私、あなたがより多くの問題がある場合。

おかげで、 Ambuj

+0

[クイックスタート:Windowsの画面の向き](http://msdn.microsoft .com/en-us/library/windowsphone/develop/jj207002(v = 1010).aspx) – Ambuj

関連する問題