缩放 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);
注意,为了保持绘图笔的粗细,最好变换底层几何而不是绘图。
我已将一组矢量数据加载到我的应用程序中,其范围从 {-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);
注意,为了保持绘图笔的粗细,最好变换底层几何而不是绘图。