Итак, покопавшись, я решил свою проблему. Решение состояло в том, чтобы использовать Thumb .
Мой UserControl XAML выглядит так:
<UserControl x:Class="WpfTest.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Border Background="Blue">
<Grid>
<Grid.ColumnDefinitions>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="26"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Canvas Grid.Row="0" Background="orange"></Canvas>
<Thumb Grid.Row="0" Background="Cyan" DragCompleted="OnDragComplete" DragStarted="OnDragStarted" DragDelta="OnDragDelta" ></Thumb>
<Canvas Grid.Row="1" Background="Purple"></Canvas>
</Grid>
</Border>
</UserControl>
Мы можем видеть добавление большого пальца другого цвета, которое закрывает оранжевый заголовок (давая мне знать, что большой палец действительно есть)
Код для событий Thumb выглядит следующим образом:
public partial class UserControl1 : UserControl
{
private bool _isDragging;
private double _x;
private double _y;
public UserControl1()
{
InitializeComponent();
}
private void OnDragComplete(object sender, DragCompletedEventArgs e)
{
_isDragging = false;
}
private void OnDragStarted(object sender, DragStartedEventArgs e)
{
_isDragging = true;
_x = (double)GetValue(Canvas.LeftProperty);
_y = (double)GetValue(Canvas.TopProperty);
}
private void OnDragDelta(object sender, DragDeltaEventArgs e)
{
if (!_isDragging) return;
_x += e.HorizontalChange;
_y += e.VerticalChange;
SetValue(Canvas.LeftProperty,_x );
SetValue(Canvas.TopProperty,_y );
}
}
И это дало мне именно то, что я хотел. Один вопрос остался: я вижу некоторый разрыв пользовательского контроля, когда я перемещаю его. Это просто не гладкий эффект рисования, и я не могу найти способ устранить это. Есть какие-нибудь подсказки?