コントロールの範囲選択に使うにはとても便利な Thumb の例を一つ。
Drag 用の便利なイベントもあって自分でマウスイベントを取得する必要もない。
[TemplatePart(Name = "top", Type = typeof(Thumb))]
[TemplatePart(Name = "left", Type = typeof(Thumb))]
[TemplatePart(Name = "right", Type = typeof(Thumb))]
[TemplatePart(Name = "bottom", Type = typeof(Thumb))]
public class SelectableRect : Thumb
{
static SelectableRect()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(SelectableRect), new FrameworkPropertyMetadata(typeof(SelectableRect)));
}
public SelectableRect()
{
this.Background = Brushes.Transparent;
this.BorderThickness = new Thickness(1);
this.BorderBrush = new SolidColorBrush(Colors.Gray);
this.Margin = new Thickness(0, 0, 0, 0);
this.Width = 200;
this.Height = 200;
this.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
this.VerticalAlignment = System.Windows.VerticalAlignment.Top;
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
Thumb top = GetTemplateChild("top") as Thumb;
top.DragStarted += new DragStartedEventHandler(Thumb_DragStarted);
top.DragCompleted += new DragCompletedEventHandler(Thumb_DragCompleted);
top.DragDelta += new DragDeltaEventHandler(top_DragDelta);
Thumb left = GetTemplateChild("left") as Thumb;
left.DragStarted += new DragStartedEventHandler(Thumb_DragStarted);
left.DragCompleted += new DragCompletedEventHandler(Thumb_DragCompleted);
left.DragDelta += new DragDeltaEventHandler(left_DragDelta);
Thumb right = GetTemplateChild("right") as Thumb;
right.DragStarted += new DragStartedEventHandler(Thumb_DragStarted);
right.DragCompleted += new DragCompletedEventHandler(Thumb_DragCompleted);
right.DragDelta += new DragDeltaEventHandler(right_DragDelta);
Thumb bottom = GetTemplateChild("bottom") as Thumb;
bottom.DragStarted += new DragStartedEventHandler(Thumb_DragStarted);
bottom.DragCompleted += new DragCompletedEventHandler(Thumb_DragCompleted);
bottom.DragDelta += new DragDeltaEventHandler(bottom_DragDelta);
this.DragStarted += new DragStartedEventHandler(Thumb_DragStarted);
this.DragCompleted += new DragCompletedEventHandler(Thumb_DragCompleted);
this.DragDelta += new DragDeltaEventHandler(SelectableRect_DragDelta);
}
void Thumb_DragStarted(object sender, DragStartedEventArgs e)
{
this.Cursor = Cursors.Hand;
e.Handled = true;
}
void Thumb_DragCompleted(object sender, DragCompletedEventArgs e)
{
this.Cursor = Cursors.Arrow;
e.Handled = true;
}
void SelectableRect_DragDelta(object sender, DragDeltaEventArgs e)
{
this.Margin = new Thickness(this.Margin.Left + e.HorizontalChange, this.Margin.Top + e.VerticalChange, 0, 0);
e.Handled = true;
}
void top_DragDelta(object sender, DragDeltaEventArgs e)
{
this.Margin = new Thickness(this.Margin.Left, this.Margin.Top + e.VerticalChange, 0, 0);
this.Height -= e.VerticalChange;
e.Handled = true;
}
void left_DragDelta(object sender, DragDeltaEventArgs e)
{
this.Margin = new Thickness(this.Margin.Left + e.HorizontalChange, this.Margin.Top, 0, 0);
this.Width -= e.HorizontalChange;
e.Handled = true;
}
void right_DragDelta(object sender, DragDeltaEventArgs e)
{
this.Width += e.HorizontalChange;
e.Handled = true;
}
void bottom_DragDelta(object sender, DragDeltaEventArgs e)
{
this.Height += e.VerticalChange;
e.Handled = true;
}
}
コントロ-ルのテンプレートはこちら。
<Style TargetType="{x:Type local:SelectableRect}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:SelectableRect}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ContentPresenter Grid.ColumnSpan="3" Grid.RowSpan="3"/>
<Thumb Name="top" Grid.Row="0" Grid.Column="1" VerticalAlignment="Top" Width="10" Height="10" />
<Thumb Name="left" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Left" Width="10" Height="10" />
<Thumb Name="right" Grid.Row="1" Grid.Column="2" HorizontalAlignment="Right" Width="10" Height="10" />
<Thumb Name="bottom" Grid.Row="2" Grid.Column="1" VerticalAlignment="Bottom" Width="10" Height="10" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
コントロール自身も Thumb でドラッグ可能だし範囲選択も Thumb でとても便利です。