代码之家  ›  专栏  ›  技术社区  ›  glenatron

缩放WPF DrawingGroup以适应当前元素

  •  0
  • glenatron  · 技术社区  · 8 年前

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

    我想在我的 FrameworkElement 它默认为663像素宽和468像素高,并且在调整元素大小时明显调整其大小。就我所能判断的顺序而言 DrawingGroup 我需要创建一个 ScaleTransform 并将其添加到 TransformGroup 然后我可以将其设置为 Transform 的 绘图组 -我想我还需要一个偏移量,以便将数据的原始位置移到视图的左上角,尽管回想起来,我最好对齐中心。

    这是我目前掌握的代码:

    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 但这似乎也不起作用(我非常希望能够在 绘图组 因此,我可以稍后将事情与它们联系起来,因此可能需要使用不必要的转换开关(O),当我检查DrawingGroup的子集合时,它们的几何图形在应用转换后似乎未被转换-我不知道这是否正确。

    我需要做什么才能使我的数据在 框架构件 ?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Clemens    8 年前

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

    请注意,为了保持图形笔的厚度,最好变换基础几何图形,而不是图形。