Bài viết trước đã đề cập đến việc sử dụng WPF và Transform để xử lý sự kiện vượt quá biên giới của canvas.
Sau khi thả chuột sau khi vượt quá biên giới, chúng ta cần làm cho phần vượt biên giới quay trở lại vị trí ban đầu.
1. Trong sự kiện MouseMove, kiểm tra xem có vượt quá biên giới hay không và ghi lại các giá trị cần thiết để reset bằng biến double offsetX và offsetY.
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed || !isMousePressed) return;
Point currentMousePosition = e.GetPosition(drawingCanvas);
double targetX = translationX + currentMousePosition.X - initialMousePosition.X;
double targetY = translationY + currentMousePosition.Y - initialMousePosition.Y;
transform.X = targetX;
transform.Y = targetY;
// Tính toán kích thước sau khi scale
double scaledWidth = drawingBoard.ActualWidth * scaleFactor;
double scaledHeight = drawingBoard.ActualHeight * scaleFactor;
double canvasWidth = drawingCanvas.ActualWidth;
double canvasHeight = drawingCanvas.ActualHeight;
// Giới hạn trái
double leftLimit = -(scaledWidth - canvasWidth);
// Giới hạn dưới
double bottomLimit = -(scaledHeight - canvasHeight);
double offsetX = 0;
double offsetY = 0;
if (targetX > 0)
{
targetX = 0;
offsetX = targetX;
needsResetX = true;
}
if (targetX < leftLimit)
{
targetX = leftLimit;
offsetX = targetX;
needsResetX = true;
}
if (targetY > 0)
{
targetY = 0;
offsetY = targetY;
needsResetY = true;
}
if (targetY < bottomLimit)
{
targetY = bottomLimit;
offsetY = targetY;
needsResetY = true;
}
resetPoint = new Point(offsetX, offsetY);
}
2. Trong sự kiện MouseUp, kiểm tra xem có cần reset hay không và điều chỉnh TranslateTransform để thực hiện reset.
private void DrawingBoard_MouseUp(object sender, MouseButtonEventArgs e)
{
AddElement(e.GetPosition(drawingBoard));
isMousePressed = false;
drawingBoard.ReleaseMouseCapture();
if (needsResetX)
{
transform.X = resetPoint.X;
}
if (needsResetY)
{
transform.Y = resetPoint.Y;
}
needsResetX = needsResetY = false;
resetPoint = new Point();
if (needsResetX || needsResetY)
{
Console.WriteLine($"Đã reset về vị trí: {transform.X}, {transform.Y}");
}
}