WPF - Перемещение холста - PullRequest
       9

WPF - Перемещение холста

0 голосов
/ 24 октября 2019

У меня проблемы с перемещением холста в окне.

    <Canvas x:Name="Canvas1" Height="200" Grid.Column="1" Margin="10,15,92,54" Grid.Row="1" Background="#FFECECEC" Grid.RowSpan="2" MouseDown="Canvas_MouseDown" MouseUp="Canvas_MouseUp" MouseMove="Canvas_MouseMove" >
        <TextBox Height="100" Width="100" Margin="50,50,327,65" Background="Red"/>
        <TextBox Height="100" Width="100" Margin="10,15,327,65" Background="Blue" />
        <Canvas.RenderTransform>
            <TransformGroup>
                <TranslateTransform x:Name="translate" />
            </TransformGroup>
        </Canvas.RenderTransform>
    </Canvas>

Это код:

    private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
    {
        Canvas1.CaptureMouse();
        point = Mouse.GetPosition(Grid1);
    }

    private void Canvas_MouseMove(object sender, MouseEventArgs e)
    {
        if (Canvas1.IsMouseCaptured)
        {
            translate.X = e.GetPosition(Grid1).X - point.X;
            translate.Y = e.GetPosition(Grid1).Y - point.Y;
        }
    }

    private void Canvas_MouseUp(object sender, MouseButtonEventArgs e)
    {
        Canvas1.ReleaseMouseCapture();
    }

В первый раз все выглядит хорошо. Но во второй раз я пытаюсь щелкнуть по своему холсту, это движение, но из начальной позиции. Как я могу это исправить?

1 Ответ

2 голосов
/ 24 октября 2019

При инициализации point при наведении мыши вычтите текущий перевод:

private void Canvas1_MouseDown(object sender, MouseButtonEventArgs e)
{
    Canvas1.CaptureMouse();
    point = Mouse.GetPosition(Grid1);
    point.X -= translate.X;
    point.Y -= translate.Y;
}

В качестве альтернативы всегда добавляйте только разностный вектор:

private void Canvas1_MouseDown(object sender, MouseButtonEventArgs e)
{
    Canvas1.CaptureMouse();
    point = Mouse.GetPosition(Grid1);
}

private void Canvas1_MouseMove(object sender, MouseEventArgs e)
{
    if (Canvas1.IsMouseCaptured)
    {
        var p = e.GetPosition(Grid1);
        var diff = p - point;
        point = p;

        translate.X += diff.X;
        translate.Y += diff.Y;
    }
}

Также убедитесь, чтоСетка не позиционирует Canvas, установив выравнивание Canvas по верхнему / левому краю:

<Canvas x:Name="Canvas1" HorizontalAlignment="Left" VerticalAlignment="Top" ...>

И, возможно, не устанавливайте Margin, а вместо этого инициализируйте TranslateTransform соответствующим образом.

...