GridViewコントロールはWindows 8.1/10でデフォルトの挙動が異なる。本稿では、この挙動をWindows 10に合わせるための方法を解説する。
powered by Insider.NET
Windows 10では、GridViewコントロール(Windows.UI.Xaml.Controls名前空間)に項目を並べる方向とスクロールする方向が変わる。Windows 8.1向けに開発したWindowsランタイムアプリでGridViewコントロールを使っている場合、Windows 10にインストールすると他のWindows 10アプリと操作性が違ってしまう。Windows 8.1向けのアプリでも、GridViewコントロールのスクロール方向をWindows 10と同じにできないだろうか? 本稿ではその方法を解説する。なお、本稿のサンプルは「Windows Store app samples:MetroTips #104」からダウンロードできる。
ユニバーサルプロジェクトを使ってユニバーサルWindowsアプリを開発するには、以下の開発環境が必要である。本稿では、無償のVisual Studio Community 2013 with Update 4を使っている。
*1 SLAT対応ハードウエアは、Windows Phone 8.1エミュレーターの実行に必要だ。ただし未対応でも、ソースコードのビルドと実機でのデバッグは可能だ。SLAT対応のチェック方法はMSDNブログの「Windows Phone SDK 8.0 ダウンロードポイント と Second Level Address Translation (SLAT) 対応PCかどうかを判定する方法」を参照。なお、SLAT対応ハードウエアであっても、VM上ではエミュレーターが動作しないことがあるのでご注意願いたい。
*2 事前には「Windows 8.1 Update 1」と呼ばれていたアップデート。スタート画面の右上に検索ボタンが(環境によっては電源ボタンも)表示されるようになるので、適用済みかどうかは簡単に見分けられる。ちなみに公式呼称は「the Windows RT 8.1, Windows 8.1, and Windows Server 2012 R2 update that is dated April, 2014」というようである。
*3 Windows Phone 8.1エミュレーターを使用しないのであれば、32bit版のWindows 8.1でもよい。
*4 マイクロソフトのダウンロードページから誰でも入手できる(このURLはUpdate 4のもの)。
*5 本稿に掲載したコードを試すだけなら、無償のExpressエディションやCommunityエディションで構わない。Visual Studio Express 2013 with Update 4 for Windows(製品版)はマイクロソフトのページから無償で入手できる。Expressエディションはターゲットプラットフォームごとに製品が分かれていて紛らわしいが、Windowsランタイムアプリの開発には「for Windows」を使う(「for Windows Desktop」はデスクトップで動作するアプリ用)。また、2014年11月12日(米国時間)に新しくリリースされたVisual Studio Community 2013 with Update 4(製品版)もマイクロソフトのページから無償で入手できる。Communityエディションは本稿執筆時点では英語版だけなので、同じ場所にあるVisual Studio 2013 Language Packの日本語版を追加インストールし、[オプション]ダイアログで言語を切り替える必要がある。
Visual Studio 2013 Update 2(Update 3/4も)では、残念なことにVB用のユニバーサルプロジェクトのテンプレートは含まれていない*6。そのため、本稿で紹介するVBのコードはユニバーサルプロジェクトではなく、PCL(ポータブルクラスライブラリ)を使ったプロジェクトのものである。
*6 VB用のユニバーサルプロジェクトは、2015年の夏にリリースされるといわれているVisual Studio 2015(開発コード「Visual Studio 14」)からの提供となるようだ。プレビュー版で、すでに共有プロジェクトは利用可能になっている。「特集:次期Visual Studioの全貌を探る:Visual Basic 14の新機能ベスト10〜もう「VBだから」とは言わせない!」参照。
Windows 8.x向けのWindowsランタイムアプリでは、アプリの主となるスクロール方向は横方向だった。これがWindows 10では縦方向に変更されたのである(次の画像)。Windows Phoneでは以前から縦方向であったので、そちらに合わせたと見ることもできる。
これはユーザーエクスペリエンス(UX)としては非常に重要な変化であるから、Windows 8.1向けのアプリに取り入れるかどうかは、難しい問題である。Windows 10でチャームがなくなることへの対応やアプリバーが出しにくくなることへの対応は、画面にUIを追加するだけであった。それに対して、スクロール方向の変更というのは、単にGridViewコントロールの方向を変えるだけでは済まず、おそらくはUI設計の根本的な見直しが必要になるだろう。従って、既存のWindows 8.1向けのアプリはそのままにしておいて、Windows 10用に新しいバージョンを開発する方がよいと思われる。運よくUI設計の大幅変更にならなかった場合は、以降の解説を参考にしてWindows 10対応を考えてほしい。
まず、GridViewコントロールを使った簡単なアプリを用意しよう。1から20までの数字を表示するものとする。表示するデータは、次のコードだ。
using System.Collections.Generic;
using System.Linq;
namespace MetroTips104CS
{
public class SampleData
{
public IList<string> Numbers { get; private set; }
public SampleData()
{
var list = new List<string>();
list.AddRange(
Enumerable.Range(1,20).Select(n => n.ToString())
);
this.Numbers = list;
}
}
}
Public Class SampleData
Private _numbers As List(Of String) = New List(Of String)()
Public Property Numbers As IList(Of String)
Get
Return _numbers
End Get
Private Set(value As IList(Of String))
_numbers = value
End Set
End Property
Public Sub New()
_numbers.AddRange(
Enumerable.Range(1, 20).Select(Function(n) n.ToString())
)
End Sub
End Class
次に、ユーザーコントロールを共有プロジェクト(VBではPCLプロジェクト)に作り、ファイル名を「NumbersGridNormal.xaml」とする。そのコンテンツとして、次のコードのようなGridViewコントロールを記述する。
<GridView Grid.Row="1" Width="300" ItemsSource="{Binding Numbers}">
<GridView.Resources>
<local:SampleData x:Key="SampleData" />
</GridView.Resources>
<GridView.DataContext>
<StaticResource ResourceKey="SampleData"/>
</GridView.DataContext>
<GridView.ItemTemplate>
<DataTemplate>
<Grid Width="80" Height="80" Background="Blue">
<TextBlock Text="{Binding}" FontSize="45" Foreground="White"
FontFamily="Segoe WP Black"
HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
このユーザーコントロールをメイン画面に貼り付けて実行すると、次の画像のようになる。
GridViewコントロールのスクロール方向と、ItemsPanelTemplateコントロール(Windows.UI.Xaml.Controls名前空間)の並び方向を変えればよい。
具体的には、GridViewコントロールのXAMLコードを、次のコードのように変更する。元のコードと実行結果を区別するために、ここでは項目の背景色も変えている。
<GridView Grid.Row="1" Width="300" ItemsSource="{Binding Numbers}">
<GridView.Resources>
……省略(前のコードと同じ)……
<Grid Width="80" Height="80" Background="DarkRed">
……省略(前のコードと同じ)……
</GridView.ItemTemplate>
<!-- ItemsPanelTemplateの方向を横並びにする -->
<GridView.ItemsPanel>
<ItemsPanelTemplate>
<VariableSizedWrapGrid Orientation="Horizontal" />
</ItemsPanelTemplate>
</GridView.ItemsPanel>
<!-- スタイル定義で、スクロール方向を縦にする -->
<GridView.Style>
<Style TargetType="GridView">
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
<Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled" />
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.VerticalScrollMode" Value="Auto" />
</Style>
</GridView.Style>
</GridView>
これで実行してみると、次の画像のようになる。Windows 8.1でも縦スクロールになっている。
Windows 10では、Windows 8.1と比べて項目の並び順とスクロール方向の縦横が入れ替わる(Windows Phone 8.1と同じになる)。これはUXの大きな変更であり、既存のWindows 8.1向けアプリに採用するのは難しいものがある。ただし、そのようにGridViewコントロールを対応させることは、XAMLコードだけで簡単にできる。
Copyright© Digital Advantage Corp. All Rights Reserved.