WPFでコントロールをドラッグ(1) | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/709
Thumbコントロールでドラッグ | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/698
なところで、WPF のドラッグコントロールを探していたのですが、どうやら Thumb コントロールを使って template で形状を変えるのがよさそうです。ここでは、Thumb.Template を使って形状を変えていますが、まぁ、これを static resource に書いても良いし、それは色々ってところでしょう。
<Window x:Class="SampleWpfDrag.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Canvas>
<TextBlock Canvas.Left="0" Canvas.Top="0" Height="22" Name="textPos" Width="75" Text="x:0 y:0" />
<Thumb Canvas.Left="37" Canvas.Top="30" Height="30" Name="mark" Width="30" Background="LightBlue"
DragCompleted="mark_DragCompleted"
DragStarted="mark_DragStarted"
DragDelta="mark_DragDelta"
>
<Thumb.Template>
<ControlTemplate TargetType="Thumb">
<Ellipse Fill="LightBlue" Width="30" Height="30" />
</ControlTemplate>
</Thumb.Template>
</Thumb>
</Canvas>
</Window>
ドラッグイベント自体は、前の記事に書いた通りで、複数のコントロールを利用する場合には、別途イベントの追加の仕方を考えたほうがよいかなと。ただし、ドラッグイベント自体は基本的に変わらないので、なんらかの形で Thumb コントロールを包んでやるほうが実装的には良い気がします。画面上からはみだすとか、そんな感じの動きとか。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void printPos(UIElement el)
{
int x = (int)Canvas.GetLeft(el);
int y = (int)Canvas.GetTop(el);
textPos.Text = string.Format("x:{0} y:{1}", x, y);
}
/// <summary>
/// ドラッグ開始
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mark_DragStarted(object sender,
System.Windows.Controls.Primitives.DragStartedEventArgs e)
{
mark.Background = new SolidColorBrush(Colors.Orange);
}
/// <summary>
/// ドラッグ終了
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mark_DragCompleted(object sender,
System.Windows.Controls.Primitives.DragCompletedEventArgs e)
{
mark.Background = new SolidColorBrush(Colors.Purple);
}
/// <summary>
/// ドラッグ中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mark_DragDelta(object sender,
System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
printPos(mark);
Canvas.SetLeft(mark, Canvas.GetLeft(mark) + e.HorizontalChange);
Canvas.SetTop(mark, Canvas.GetTop(mark) + e.VerticalChange);
}
}


