[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
<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
/// <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 のサンプルに上げておきます。
実行するとこんな感じです。普通にタッチのドラッグで動きます。
これで、スライドゲームの準備ができたので「進めます」ってことで。