所以我有一个带有 2 列网格的 WPF 窗口。在第一列中,我有一个要渲染 SVG 图像的画布。此画布被重新调整为与图像相同的大小(因此没有进行转换),并且假设图像比屏幕小很多,因此不需要滚动查看器 - 我会将此称为左侧画布。
在第二列中,我有另一个位于 Viewbox 内的画布,同样的 SVG 也被渲染到这个画布上,并且假设 SVG 图像大小大于 Viewbox 固定大小。Viewbox 会重新调整画布的大小以适合其中 - 尽管似乎没有对画布应用任何变换并且没有改变其宽度或高度,但这里还有一些其他的魔法 - 但是很好,它可以工作。
这个想法是用户可以在左侧画布上绘制一个矩形,这将代表一个缩放区域,然后右侧画布将放大,以便该矩形适合包含画布的 Viewbox - 我的意思是不裁剪或拉伸/squashing 任何缩放区域,因此如果它是纵向 Viewbox 中的横向缩放区域,则缩放区域的侧面将与 Viewbox 的侧面相交,在顶部和底部留出空间,这很好。
我认为这将是直截了当的,因为没有对任何一个画布应用任何变换,并且它们都具有相同的宽度和高度(尽管 Viewbox 中的一些魔法正在使右边的画布变小)。这就是我目前的做法:
找到中心点:
centreX = Canvas.GetLeft(zoomAreaRect) + (zoomAreaRect.Width / 2);
centreY = Canvas.GetTop(zoomAreaRect) + (zoomAreaRect.Height / 2);
求比例量:
double scale;
if(zoomAreaRect.Width > zoomAreaRect.Height)
{
scale = RightCanvas.Width / zoomAreaRect.Width;
}
else
{
scale = RightCanvas.Height / zoomAreaRect.Height;
}
然后使用 centerX 和 centerY 作为变换中心的缩放变换,并在变换上同时缩放 scaleX 和 scaleY。
现在这显然不起作用,因为我需要在计算比例量时以某种方式考虑 Viewbox 大小,我只是不确定如何执行此操作。有人可以帮忙吗?
更新:
我已经废弃了 Viewbox,因为这会使事情变得复杂。所以正确的画布也只是正常大小,但包含在具有固定宽度和高度的边框内。目的是放大缩放区域,直到它适合边界。
这是右侧的 XAML:
<Border Name="ContainingBorder"
Grid.Column="1"
MaxWidth="295"
MaxHeight="487"
Height="487">
<Border.Clip>
<RectangleGeometry Rect="0.5, 0.5, 295, 487"/>
</Border.Clip>
<Canvas Name="RightCanvas"/>
</Border>
我设法放大了正确的数量,只是没有放大到正确的中心。我只是使用纵横比作为似乎有效的比例量:
double ratioX = ContainingBorder.AcctualWidth / zoomAreaRect.Width;
double ratioY = ContainingBorder.AcctualHeight / zoomAreaRect.Height;
double scale = ratioX < ratioY ? ratioX : ratioY;
有什么想法可以计算出中心 x 和 y 吗?上述 centerX 和 centerY 计算似乎无法正常工作。