Hi,
in welchem Container befindet sich das Canvas-Steuerlement? Sinnvoll ist das Verschieben eines Canvas auf eine neue Position nur dann, wenn es sich selbst in einem Canvas befindet. Oder meinst Du vielleicht, wie man die Position eines Steuerelementes innerhalb
eines Canvas festlegt?
Hier mal eine Demo, wo in einem Canvas ein Border mit Inhalt mit gedrückter Maustaste innerhalb des Canves verschoben werden kann.
XAML:
<Window x:Class="WpfApp1CS.Window26"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1CS"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
mc:Ignorable="d"
Title="Window26" Height="300" Width="300">
<Canvas>
<Border BorderBrush="red" BorderThickness="2" Width="50" Height="50">
<i:Interaction.Behaviors>
<local:Window26Behavior/>
</i:Interaction.Behaviors>
<Label Content="Demo" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</Canvas>
</Window>
Dazu die Behavior-Klasse:
public class Window26Behavior : Behavior<Border>
{
protected override void OnAttached()
{
AssociatedObject.MouseDown += AssociatedObject_MouseDown;
AssociatedObject.MouseUp += AssociatedObject_MouseUpLeave;
AssociatedObject.MouseMove += AssociatedObject_MouseMove;
AssociatedObject.MouseLeave += AssociatedObject_MouseUpLeave;
}
protected override void OnDetaching()
{
AssociatedObject.MouseDown -= AssociatedObject_MouseDown;
AssociatedObject.MouseUp -= AssociatedObject_MouseUpLeave;
AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
AssociatedObject.MouseLeave -= AssociatedObject_MouseUpLeave;
}
private double dx = double.NaN;
private double dy;
private void AssociatedObject_MouseDown(object sender, MouseButtonEventArgs e)
{
Border b = (Border)sender;
Canvas cv = (Canvas)b.Parent;
double posx = (double)b.GetValue(Canvas.LeftProperty);
dx = e.GetPosition(cv).X - (double.IsNaN(posx) ? 0 : posx);
double posy = (double)b.GetValue(Canvas.TopProperty);
dy = e.GetPosition(cv).Y - (double.IsNaN(posy) ? 0 : posy);
}
private void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
{
if (!double.IsNaN(dx))
{
Border b = (Border)sender;
Canvas cv = (Canvas)b.Parent;
Point pt = e.GetPosition(cv);
b.SetValue(Canvas.LeftProperty, pt.X - dx);
b.SetValue(Canvas.TopProperty, pt.Y - dy);
}
}
private void AssociatedObject_MouseUpLeave(object sender, EventArgs e) => dx = double.NaN;
}
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks