缩放WPF DrawingGroup以适合当前元素

时间:2018-01-30 21:57:03

标签: c# wpf vector-graphics

我已将一组矢量数据加载到我的应用程序中,其边界从{-165835.328125, 6582072.5}延伸到{-64674.02734375, 6609767},宽度为101161.30078125,高度为27694.5。

我想在我的FrameworkElement上显示这些数据,默认为663像素宽,468像素高,显然在调整元素大小时调整大小。据我所知,为了缩放我的DrawingGroup,我需要创建一个ScaleTransform并将其添加到TransformGroup,然后我可以将其设置为Transform { {1}} - 我想我还需要一个偏移量才能将我数据的原点位置带到视图的左上角,尽管回想起来我可能最好不要对齐中心。

这是我目前的代码:

DrawingGroup

这在多个级别上很粗糙,但现在困扰我的主要原因是它不起作用。我可以在输入上调整数据(如果我在生成几何图形时手动平移点),它只会略微绘制错误,所以我认为几何存在但是在可见区域之外,据我所知只能翻译什么都不做。我尝试将变换推送到var transformWidth = this.drawingGroup.Bounds.Width; var scale = width / transformWidth; var left = this.drawingGroup.Bounds.Left * -1; var top = this.drawingGroup.Bounds.Top * -1; var translateTransform = new TranslateTransform(left, top); var scaleTransform = new ScaleTransform(); scaleTransform.CenterX = (drawingGroup.Bounds.Width / 2); scaleTransform.CenterY = (drawingGroup.Bounds.Height / 2); scaleTransform.ScaleX = scale; scaleTransform.ScaleY = scale; var tg = new TransformGroup() { Children = new TransformCollection() { translateTransform, scaleTransform } }; var oldTransform = this.drawingGroup.Transform; this.drawingGroup.Transform = tg; context.DrawDrawing(this.drawingGroup); this.drawingGroup.Transform = oldTransform; ,但这似乎也没有用(我非常希望能够保持DrawingContext上的原始坐标,这样我就能把事情联系起来对他们来说,因此可能是不必要的Transform switcheroo)当我检查DrawingGroup的子集合时,他们的几何在翻译应用后似乎没有翻译 - 我不知道这是否正确。

我需要做些什么才能在我的DrawingGroup中看到我的数据?

1 个答案:

答案 0 :(得分:2)

Bounds属性将当前变换考虑在内。

在访问Bounds之前重置Transform属性:

drawingGroup.Transform = Transform.Identity;

var bounds = drawingGroup.Bounds;
var scale = width / bounds.Width;
var matrix = new Matrix();
matrix.Translate(-bounds.X, -bounds.Y);
matrix.Scale(scale, scale);

drawingGroup.Transform = new MatrixTransform(matrix);

作为说明,为了保持图纸的厚度。笔,更好地转换底层几何图形而不是图纸。