次に、[ソリューション・エクスプローラー]内の「MainWindow.xaml」を展開して表示される、「MainWindow.xaml.vb」をダブルクリックしてコードを記述する。
ここでは、コードが長くなるため、主にページがアクティブになった時の処理(OnNavigatedToメソッド処理)について解説する。全てのコードを見る場合は、サンプルのプロジェクトをダウンロードして「MainWindow.xaml.vb」ファイルを見ていただきたい。
Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) Dim no As Integer = 0 Dim xmldoc As XElement = XElement.Load("photo_etc.xml") For Each result In From c In xmldoc.Descendants("情報") Select c Dim myImage As New Image With myImage .Width = 640 .Height = 480 .Source = New BitmapImage(New Uri("ms-appx:///Images/" & result.Element("画像名").Value, UriKind.Absolute)) .RenderTransform = New CompositeTransform .ManipulationMode = ManipulationModes.All End With ShowArea.Children.Add(myImage) ‘ このプログラムの肝。画像の移動、拡大縮小、回転の処理だ。 AddHandler myImage.ManipulationDelta, Sub(mySender As Object, myArgs As Input.ManipulationDeltaRoutedEventArgs) Dim myTrans = DirectCast(myImage.RenderTransform, CompositeTransform) myTrans.TranslateX = myTrans.TranslateX + myArgs.Delta.Translation.X myTrans.TranslateY = myTrans.TranslateY + myArgs.Delta.Translation.Y myTrans.ScaleX = myTrans.ScaleX * myArgs.Delta.Scale myTrans.ScaleY = myTrans.ScaleY * myArgs.Delta.Scale myTrans.CenterX = 320 myTrans.CenterY = 240 myTrans.Rotation = myTrans.Rotation + myArgs.Delta.Rotation myImage.SetValue(Canvas.ZIndexProperty, no) no += 1 End Sub Next End Sub
以降、上記コードの中身を詳細に見ていこう。
まず、変数「no」を宣言し「0」で初期化しておく。
次に、XElement.LoadメソッドでXML文書ファイル(photo_etc.xml)を読み込む。読み込んだXMLのDescendantsメソッドで、すべての子孫要素<情報>に対して、要素の値を変数resultに格納しながら反復処理を行う。
新しいImageのインスタンス「myImage」オブジェクトを作成する。[Width]に「640」、[Height]に「480」の値を指定し、[Source]プロパティに、画像を格納している「ms-appx:///Images」フォルダーと、<画像名>要素の値を連結して設定する。
UIElementの描画位置に影響する変換情報を設定する[RenderTransform]プロパティに、1つのオブジェクトに複数の異なる変換を適用できる「CompositeTransform」を指定する。
ジェスチャーとともにUIElementの動作および操作に使用される[ManipulationMode]に、すべての相互作用モードを有効にする、「ManipulationModes.All」を指定。UIElement.ManipulationModes列挙体については、下記のURLを参考にしてほしい。
「ShowArea」というCanvasに各プロパティの設定されたmyImageオブジェクトを追加。これで、画像が表示されるようになる。画像は左隅上に重なって表示される。
AddHandlerステートメントで、操作中に入力デバイスが位置を変更した時に発生するManipulationDeltaイベントに、イベントハンドラを追加する。イベントハンドラ内では以下の処理を行う。
TranslateXとTranslateYで、x軸とy軸に沿って並行移動する距離を、ScaleXとScaleYで、オブジェクトを拡大縮小する値を設定する。
[Rotaion]プロパティでオブジェクトを回転させる。[CenterX]と[CenterY]には実際の画像サイズの半分の[Width]と[Height]の値を指定する(320と240の値)。これで、画像の中心を起点として回転するようになる。
SetValueメソッドでZIndexPropertyに1ずつ加算される変数noの値を指定する(選択された画像が一番手前に配置されるようになる)。
今回は、ここまでだ。また、次回お会いしよう。次回は選択した画像をトリミングして保存させる方法を紹介する。
本コンテストでは、2013年9月1日〜12月1日に新たにWindowsストアに新規公開されたアプリを募集します。入賞したアプリの製作者には、総額130万円の賞金が授与されますので、ふるってご応募ください。
PROJECT KySS 薬師寺 国安(やくしじ くにやす)
1950年生まれ。フリーVBプログラマ。高級婦人服メーカーの事務職に在職中、趣味でVBやActiveXに取り組み、記事を執筆。2003年よりフリー。.NETやRIAに関する執筆多数。Windowsストアアプリも多数公開中(約270本)。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
PROJECT KySSは、1997年に薬師寺聖と結成したコラボレーション・ユニット
Copyright © ITmedia, Inc. All Rights Reserved.