我使用这个项目作为参考:https://www.codeproject.com/Articles/168176/Zooming-and-panning-in-WPF-with-fixed-focus,但我想限制图像从屏幕上平移。我想平移停止在一个轴时,图像的边缘是一些固定的距离从边界的边缘。例如,图像的右边缘应始终与边框的左边缘相距至少+70。
我已经找到了一些答案和未回答的问题,但这一个似乎让我更接近:
wpf-image-panning-constraints
我修改了鼠标移动代码如下:
private void image_MouseMove(object sender, MouseEventArgs e)
{
if (!image.IsMouseCaptured) return;
Point p = e.MouseDevice.GetPosition(border);
Point relativePoint = image.TransformToAncestor(border)
.Transform(new Point(0, 0));
Matrix m = image.RenderTransform.Value;
var xDelta = p.X - start.X;
var yDelta = p.Y - start.Y;
m.OffsetX = origin.X + (xDelta);
m.OffsetY = origin.Y + (yDelta);
var currentImageBounds = ImageBounds();
var relativePosition = image.TransformToAncestor(border).Transform(new Point(0, 0));
if (currentImageBounds.Right <= 70 && xDelta<0)
{
//I'm messing with this code to modify/fix the x offset
m.OffsetX = origin.X;//CurrentImageBounds.Left + 70 ; //+ CurrentImageBounds.Width+70;
}
image.RenderTransform = new MatrixTransform(m);
}
private void image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (image.IsMouseCaptured) return;
image.CaptureMouse();
start = e.GetPosition(border);
origin.X = image.RenderTransform.Value.OffsetX;
origin.Y = image.RenderTransform.Value.OffsetY;
}
private Rect ImageBounds()
{
var rect = new Rect(image.RenderSize);
var bounds = image.TransformToAncestor(border).TransformBounds(rect);
//CurrentImageBounds = bounds;
Debug.WriteLine($"ImageRight: {bounds.Right}");
return bounds;
}
当我达到70px的阈值时,图像只是在边缘反弹。我漏掉了什么东西卡住了。
我该如何实现这一点?
1条答案
按热度按时间uidvcgyl1#
下面是一个在Canvas中缩放和平移Image元素的简短示例。它处理画布上的鼠标事件,而不是图像上的。
看一下
MouseMove
事件处理程序中的代码块if (translateConstraint > 0) { ... }
,其中每个方向上可能的转换量都是有限的。变换后的Image元素的边界是通过使用Image#s RenderTransform中MatrixTransform的Matrix
属性确定的。必须将类似的东西添加到
MouseWheel
事件处理程序中。还值得注意的是,代码不会在每次更新时重新分配Image的RenderTransform,而只是重新分配XAML中分配的MatrixTransform的
Matrix
属性。XAML:
后面的代码: