マニピュレーション
「マニピュレーション」は画面上のオブジェクトを指で移動させたり、2本指で回転や拡大をすることを指します。マニピュレーション関連イベントには下記のものがあります。
| イベント | 説明 |
| ManipulationStarting | 操作開始 |
| ManipulationDelta | 操作中 |
| ManipulationCompleted | 操作完了 |
特にManipulationDeltaイベントは重要で、回転(Rotation)、拡大/縮小(Scale)、Translation(平行移動距離)といった情報を取り扱います。
この節では、Canvas上に配置された星型の図形を回転,拡大/縮小,平行移動させる方法を例に挙げ、マニピュレーションについて説明します。
この例で使用するXAMLは下記の通りです。星型はExpression Blend SDKに含まれるRegularPolygonを使用しています。
<Window x:Class="Window4"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing"
Title="04.図形を回転/拡大/縮小させる" Height="300" Width="300">
<Canvas Name="canvas1">
<ed:RegularPolygon Height="150" InnerRadius="0.56"
Canvas.Left="60" Canvas.Top="60"
Width="150" Fill="#FFDAE508"
PointCount="5" Stretch="Fill"
IsManipulationEnabled="True"/>
</Canvas>
</Window>
マニピュレーション操作
まず、操作対象のオブジェクト(この例では星型)がマニピュレーションに対応できるオブジェクトであることを示すために、星(RegularPolygon)のIsManipulationEnabledプロパティにTrueを設定しておきます。
次に、ManipulationStartingイベントでコンテナーを取得します。操作対象のオブジェクトの座標が、どのコントロールを基準とするかを設定するものです。
この例では、星はcanvas1という名前が付けられたCanvasコントロール上に配置されているので 引数eのManipulationContainerプロパティにcanvas1を設定します。
操作開始時の処理
Private Sub canvas1_ManipulationStarting(sender As System.Object, e As System.Windows.Input.ManipulationStartingEventArgs) Handles canvas1.ManipulationStarting
'★★★操作対象オブジェクトがあるコンテナーを指定する★★★
e.ManipulationContainer = canvas1
e.Handled = True
End Sub
// 操作開始時の処理
private void canvas1_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
{
// ★★★操作対象オブジェクトがあるコンテナーを指定する★★★
e.ManipulationContainer = canvas1;
e.Handled = true;
}
回転、拡大/縮小、平行移動処理はManipulationDeltaイベントで行います。実際の回転、拡大/縮小、平行移動処理は、操作対象オブジェクトおよび位置やサイズを管理するMatrixオブジェクトを使用します。
今どのオブジェクトが操作対象であるかは、引数eのSourceプロパティで取得することができます。また位置やサイズは操作対象オブジェクトのRendarTransformプロパティのMatrixプロパティで取得することができます。
次に、指の動きに合わせて図形を変形させます。回転させるにはRotateAtメソッドを、拡大/縮小させるにはScaleAtメソッドを、平行移動させるにはTranslateメソッドを使用します。
RotateAtメソッド、ScaleAtメソッド、Translateメソッドの書式は下記の通りです。
- RotateAt(回転角度、回転中心X座標, 回転中心Y座標)
- ScaleAt(X軸のスケーリング量, Y軸のスケーリング量, スケーリング中心X座標, スケーリング中心Y座標)
- Translate(X軸オフセット量, Y軸オフセット量)
最後に操作対象オブジェクトに変換した図形を適用します。下記はManipulationDeltaイベントで回転,拡大/縮小,平行移動を行う例です。
' 操作中の処理
Private Sub canvas1_ManipulationDelta(sender As System.Object, e As System.Windows.Input.ManipulationDeltaEventArgs) Handles canvas1.ManipulationDelta
'操作対象のオブジェクトを取得
Dim element = DirectCast(e.Source, UIElement)
'位置やサイズを管理するMatrixオブジェクトを取得
Dim matrix = (DirectCast(element.RenderTransform, MatrixTransform)).Matrix
'回転させる
matrix.RotateAt(e.DeltaManipulation.Rotation,
e.ManipulationOrigin.X, e.ManipulationOrigin.Y)
'拡大縮小させる
matrix.ScaleAt(e.DeltaManipulation.Scale.X, e.DeltaManipulation.Scale.X,
e.ManipulationOrigin.X, e.ManipulationOrigin.Y)
'平行移動させる
matrix.Translate(e.DeltaManipulation.Translation.X,
e.DeltaManipulation.Translation.Y)
'操作対象のオブジェクトに変換したMatrixを適用する
element.RenderTransform = New MatrixTransform(matrix)
e.Handled = True
End Sub
// 操作中の処理
private void canvas1_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
// 操作対象のオブジェクトを取得
var element = (UIElement)e.Source;
// 位置やサイズを管理するMatrixオブジェクトを取得
var matrix = ((MatrixTransform)element.RenderTransform).Matrix;
// 回転させる
matrix.RotateAt(e.DeltaManipulation.Rotation,
e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
// 拡大縮小させる
matrix.ScaleAt(e.DeltaManipulation.Scale.X, e.DeltaManipulation.Scale.X,
e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
// 平行移動させる
matrix.Translate(e.DeltaManipulation.Translation.X,
e.DeltaManipulation.Translation.Y);
// 操作対象のオブジェクトに変換したMatrixを適用する
element.RenderTransform = new MatrixTransform(matrix);
e.Handled = true;
}
実行例は下記の通りです。
マニピュレーション操作はManipulationStarting, ManipulationDeltaイベントを使用する。
回転はRotateAt, 拡大/縮小はScaleAt, 平行移動はTranslateメソッドを使用する。
