[C#] WPFのThumbコントロールを使ってドラッグを実装する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3701
[C#] Thumbコントロールを継承したユーザコントロールを作る | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3709
上記なところで、WPF を使ってコントロールをドラッグできるようにしましたが、今回は Metro アプリで再確認してみます。中身は XAML 形式なのでそのまま動くと思うのですが、どんな風になるのかなと。
- Thumb コントロールを使う。
- ドラッグ対象の Thumb コントロールを canvas の中に置く。
- Thumb コントロールのテンプレートに、画像を貼りつけるための Ellipse タグを用意する。
- Thumb コントロールのハンドラは後付け(複数配置するため)
ざっと、ソースコードだけ晒しておきます。
デザインはこんな感じ
▼MainPage.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | < Page x:Class = "KeshoSlidePazzle.MainPage" xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local = "using:KeshoSlidePazzle" xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable = "d" > < Page.Resources > < ControlTemplate TargetType = "Thumb" x:Name = "ImageThumb" > < Ellipse Fill = "{TemplateBinding Background}" ></ Ellipse > </ ControlTemplate > </ Page.Resources > < Grid Background = "{StaticResource ApplicationPageBackgroundThemeBrush}" > < TextBlock HorizontalAlignment = "Left" Margin = "10,10,0,0" TextWrapping = "Wrap" Text = "Kesho Slide Pazzle" VerticalAlignment = "Top" Height = "56" Width = "327" FontSize = "24" /> < Canvas HorizontalAlignment = "Left" Height = "692" Margin = "191,94,0,-18" VerticalAlignment = "Top" Width = "866" > < Thumb Canvas.Left = "345" Canvas.Top = "99" Height = "143" Name = "mark1" Width = "144" Template = "{StaticResource ImageThumb}" ></ Thumb > < Thumb Canvas.Left = "55" Canvas.Top = "73" Height = "143" Name = "mark2" Width = "144" Template = "{StaticResource ImageThumb}" ></ Thumb > </ Canvas > </ Grid > </ Page > |
▼MainPage.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | /// <summary> /// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。 /// </summary> public sealed partial class MainPage : Page { public MainPage() { this .InitializeComponent(); } /// <summary> /// このページがフレームに表示されるときに呼び出されます。 /// </summary> /// <param name="e">このページにどのように到達したかを説明するイベント データ。Parameter /// プロパティは、通常、ページを構成するために使用します。</param> protected override void OnNavigatedTo(NavigationEventArgs e) { mark1.Background = getBrush( "koma1.png" ); setHandler(mark1); mark2.Background = getBrush( "koma2.png" ); setHandler(mark2); } /// <summary> /// 画像を設定 /// </summary> /// <param name="file"></param> /// <returns></returns> private ImageBrush getBrush( string file ) { var bmp = new BitmapImage( new Uri( "ms-appx:///Assets/" + file)); var br = new ImageBrush(); br.ImageSource = bmp; return br; } /// <summary> /// ハンドラを設定 /// </summary> /// <param name="t"></param> private void setHandler(Thumb t) { t.DragCompleted += mark_DragCompleted; t.DragDelta += mark_DragDelta; t.DragStarted += mark_DragStarted; } /// <summary> /// ドラッグ終了 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void mark_DragCompleted( object sender, DragCompletedEventArgs e) { var t = sender as Thumb; t.Opacity = 1.0; } /// <summary> /// ドラッグ開始 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void mark_DragStarted( object sender, DragStartedEventArgs e) { var t = sender as Thumb; t.Opacity = 0.5; } /// <summary> /// ドラック中 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void mark_DragDelta( object sender, DragDeltaEventArgs e) { var t = sender as Thumb; Canvas.SetLeft(t, Canvas.GetLeft(t) + e.HorizontalChange); Canvas.SetTop(t, Canvas.GetTop(t) + e.VerticalChange); } } |
実は、Ellipse のような普通のコントロールにもドラッグの機能は備わっている…というか、マウスイベントをキャプチャすれば可能なのは可能なのですが、こんな風に画像を貼りけて移動するだけならば、Thumb コントロールに Template を配置したほうが手早くできます。
Thumb コントロール自体には背景が指定できないので、内部で Grid を作ってその中に Ellipse のような図形のコントロールを配置するのがミソですね。このあたり、もう少しゲームっぽい動きができたら、Windows Store app のサンプルに上げておきます。
実行するとこんな感じです。普通にタッチのドラッグで動きます。
これで、スライドゲームの準備ができたので「進めます」ってことで。