设置与另一个元素或指针相关的元素位置的正确方法

问题描述 投票:0回答:1

设置对象相对于指针的位置的正确方法是什么?我试过了

private void TextBlockPressed(object sender,   PointerRoutedEventArgs e)
{
  var currentPoint = e.GetCurrentPoint(sender as UIElement);
  Canvas.SetLeft(element, e.Position.X);
}
winui-3
1个回答
0
投票

让我向您展示一个基本示例,您可以在

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.