Windows 8 で解像度に対応すること 最終回 【テンプレート化する】
#win8dev_jp
さて、これまでの経緯はこの流れで。今回はちょうど 8回目ということで最終回。
- Windows 8 で解像度に対応すること 【考え方編】
- Windows 8 で解像度に対応すること 【横画面実装編】
- Windows 8 で解像度に対応すること 【縦画面回避編】
- Windows 8 で解像度に対応すること 【縦画面対応編】
- Windows 8 で解像度に対応すること 【縦画面コンテンツ準備編】
- Windows 8 で解像度に対応すること 【縦画面コンテンツ配置編】
- Windows 8 で解像度に対応すること 【Snap対応編】
これまでのやり方、実装をすべて盛り込み、新しいアプリケーションテンプレートを作成します。これを使えば、自動スケーリング処理を改めて実装する必要はありません。
■ 基本のプロジェクトを作る
分割アプリケーションを元に WinApp プロジェクトを作る。テンプレートを作る場合、プロジェクト名がテンプレートのひな形になるのでよく考えて作る。
■ MainPage を作って起動画面として設定する
プロジェクトメニューの「新しい項目の追加」から空白のページを作る。名前をMainPage.xaml に設定。
App.xaml.cs の OnLaunchded の後半、ItemPage を起動しているところを MainPage に設定する。
if (!rootFrame.Navigate(typeof(MainPage), "AllGroups"))
{
throw new Exception("Failed to create initial page");
}
■ 不要なファイルやフォルダを削除する
不要なファイルやフォルダを削除する。
- ItemsPage.xaml(ItemsPage.xaml.cs も一緒に削除される)
- SplitPage.xaml (SplitPage.xaml .cs も一緒に削除される)
- DataModelフォルダ
F5キーを押して実行する。真っ黒の画面が起動したらOK。
■ 自動スケーリング処理追加する
CommonフォルダのLayoutAwarePage.cs を開き、「表示状態の切り替え」を展開する。
FitViewboxGrid 関数を追加し、WindowSizeChanged メソッドから呼び出す。
private void WindowSizeChanged(object sender, WindowSizeChangedEventArgs e)
{
this.InvalidateVisualState();
FitViewboxGrid(e.Size.Width, e.Size.Height);
}
private async void FitViewboxGrid(double w, double h)
{
await System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(1));
if (this.Content.GetType() == typeof(Viewbox))
{
Viewbox root = (Viewbox)this.Content;
UIElement VBContent = ((Viewbox)this.Content).Child;
if (VBContent.GetType() == typeof(Grid))
{
Grid grid = (Grid)VBContent;
if ((w > 0) && (h > 0))
{
if (w > h)
{
grid.Width = 1366;
grid.Height = 1366 * h / w;
}
else if (w <= 320)
{
grid.Width = 640;
grid.Height = 640 * h / w;
}
else
{
grid.Width = 768;
grid.Height = 768 * h / w;
}
}
}
}
}
■ 自動スケーリング有効化プロパティを追加
この自動スケール処理のためのViewBoxを使うかどうか、ユーザーが設定できるよう AutoScaling のプロパティを追加。
[Windows.Foundation.Metadata.WebHostHidden]
public class LayoutAwarePage : Page
{
private bool _AutoScaling = true;
public bool AutoScaling {
get{return _AutoScaling;}
set { _AutoScaling = value; }
}
:
■ 起動時の処理(自動スケーリングのためのViewBox 自動追加)
そして、LayoutAwarePage のコンストラクタのなかの Loaded イベントの定義(ラムダ式)の最後からも、自動スケール処理を呼び出す。 と同時に ViewBox を自動的に入れる処理を追加(ただし、これを行うのは AutoScaling を ユーザーが True にしたときだけ)
public LayoutAwarePage()
{
if (Windows.ApplicationModel.DesignMode.DesignModeEnabled) return;
:
this.Loaded += (sender, e) =>
{
this.StartLayoutUpdates(sender, e);
:
//オートスケーリング処理が有効な場合は、UIの最上位にViewBoxを入れる
UIElement root = this.Content;
if(AutoScaling && (root.GetType() != typeof(Viewbox)))
{
this.Content = new Viewbox();
(this.Content as Viewbox).Child = root;
}
//この時点ではなぜか Width と Height が逆になっている
FitViewboxGrid(this.ActualWidth, this.ActualHeight);
};
以上で、ベースとなるプロジェクトは完成。
■ 自動スケーリング処理を有効にするには
MainPage を見てみると、AutoScaling プロパティが追加されている。デフォルトではチェックが入っているが、チェックを外せば、自動スケール処理は行われない。
尚、新しいページを追加したときにも、AutoScaling プロパティの設定が可能で、且つ ViewBox の追加処理は不要。
■ テストしてみる
試しに、MainPageに四角を追��してみた。右下に 500x500の白い四角。作業はこれだけ。
<Rectangle Fill="White" HorizontalAlignment="Right" Height="500"
Grid.Row="1" VerticalAlignment="Bottom" Width="500"/>
実行してみる。左から 1366x768、1920x1080 (100%)
そして、1920x1080(140%) 、1024x768
さらに縦:1366x768、1920x1080 (100%) 1920x1080(140%) 、1024x768
スナップもこの通り。1366x768、1920x1080 (100%)
ばっちりです。画面作成はあまり気にしなくてすみそうです。
■ テンプレート化する
では、後はこれをテンプレートとして追加しましょう。(テスト用の四角は削除しておきましょう。)
「ファイル」メニューから「テンプレートのエクスポート」をします。そしてプロジェクトのテンプレートの選択を確認して次へ。
テンプレートの説明文を入れて、もしあれば画面のスクリーンショットやアイコンを追加して保存します。
で、テンプレートの完成。新しいアプリケーションを作成仕様とすると、きちんとテンプレートができていることがわかります。
ただし、実際にはこのままテンプレートとして使うには、不十分。GUIDが同じだったりするのでいろいろ処理をしないといけません。
今回は割愛。
■ テンプレートの使い方
テンプレートをダウンロードできるようにしました。
ダウンロードしたら、ドキュメントライブラリのVisual Studio 2012 以下の Template フォルダ下の ProjectTemplates の下においてください(C#の中でもOK)
後はプロジェクトの作成で、言語のところで Windows ストア ではなく、その1つ上の、Visual C# を選べば、真ん中のペインの中から、WinApp テンプレートを選択できるはずです。