缩放 WPF DrawingGroup 以适应当前元素

Scale WPF DrawingGroup to fit in the current Element

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

我想在我的 FrameworkElement 上显示此数据,它默认为 663 像素宽和 468 像素高,并且在调整元素大小时显然会调整它的大小。据我判断,为了缩放我的 DrawingGroup,我需要创建一个 ScaleTransform 并将其添加到 TransformGroup,然后我可以将其设置为 Transform 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 上,但这似乎也不起作用(我非常希望能够在 DrawingGroup 上保持原始坐标,这样我就可以将它们联系起来后来,因此可能是不必要的 Transform switcheroo )并且当我检查 DrawingGroup 的子集合时,它们的几何图形在应用翻译后似乎未翻译 - 我不知道这是否正确。

我需要做什么才能让我的数据在 FrameworkElement 中可见?

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

在访问边界之前重置转换 属性:

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);

注意,为了保持绘图笔的粗细,最好变换底层几何而不是绘图。