设置对象相对于指针的位置的正确方法是什么?我试过了
private void TextBlockPressed(object sender, PointerRoutedEventArgs e)
{
var currentPoint = e.GetCurrentPoint(sender as UIElement);
Canvas.SetLeft(element, e.Position.X);
}
让我向您展示一个基本示例,您可以在
Rectangle
上拖动 Canvas
:
*.xaml
<Canvas
x:Name="CanvasControl"
Background="Transparent"
PointerMoved="CanvasControl_PointerMoved"
PointerPressed="CanvasControl_PointerPressed"
PointerReleased="CanvasControl_PointerReleased">
<Rectangle
Width="100"
Height="100"
Fill="SkyBlue"
PointerPressed="Rectangle_PointerPressed" />
</Canvas>
*xaml.cs
private UIElement? DraggingUIElement { get; set; }
private Point DeltagStartPoint { get; set; }
private void Rectangle_PointerPressed(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e)
{
DraggingUIElement = sender as UIElement;
}
private void CanvasControl_PointerReleased(object sender, PointerRoutedEventArgs e)
{
DraggingUIElement = null;
}
private void CanvasControl_PointerPressed(object sender, PointerRoutedEventArgs e)
{
if (sender is not Canvas canvasControl)
{
return;
}
DeltagStartPoint = e.GetCurrentPoint(canvasControl).Position;
}
private void CanvasControl_PointerMoved(object sender, PointerRoutedEventArgs e)
{
if (DraggingUIElement is null ||
sender is not Canvas canvasControl)
{
return;
}
var point = e.GetCurrentPoint(canvasControl).Position;
double deltaX = point.X - DeltagStartPoint.X;
double deltaY = point.Y - DeltagStartPoint.Y;
double elemnetX = Canvas.GetLeft(DraggingUIElement);
double elementY = Canvas.GetTop(DraggingUIElement);
double newX = elemnetX + deltaX;
double newY = elementY + deltaY;
Canvas.SetLeft(DraggingUIElement, newX);
Canvas.SetTop(DraggingUIElement, newY);
DeltagStartPoint = point;
}