【问题标题】:C# WPF -> How to get the coordinates from a stretched(uniform) polygon on a gridC# WPF -> 如何从网格上的拉伸(均匀)多边形获取坐标
【发布时间】:2015-02-25 21:30:50
【问题描述】:

我进行了很多搜索以找到解决问题的方法。找不到任何东西。

这就是我的工作:

我通过网格上的点数组渲染多边形。多边形自动调整大小以匹配网格大小(统一)。我用以下几行得到了新的拉伸坐标,并用一种​​方法创建了椭圆:

var transform = myPolygon.RenderedGeometry.Transform;
foreach (var point in myPolygon.Points)
{
    var transformedPoint = transform.Transform(point);
    CreateEllipse(5, 5, Convert.ToDouble(Convert.ToString(transformedPoint).Split(';')[0]), Convert.ToDouble(Convert.ToString(transformedPoint).Split(';')[1]), gridPoly);
}

Ellipse CreateEllipse(double width, double height, double desiredCenterX, double desiredCenterY, Grid grid)
{
    Ellipse ellipse = new Ellipse { Width = width, Height = height };
    double left = desiredCenterX - (width / 2);
    double top = desiredCenterY - (height / 2);
    ellipse.Stroke = System.Windows.Media.Brushes.Black;
    ellipse.Fill = System.Windows.Media.Brushes.DarkBlue;
    ellipse.Margin = new Thickness(left, top, 0, 0);
    grid.Children.Add(ellipse);
    return ellipse;
}

问题是,如果我将多边形放在网格上,然后将椭圆放在网格上,它们将呈现精确的一半大小,而不是在正确的位置,甚至不是相对的。如果我将拉伸设置为“无”,也会发生同样的情况。

如果我在画布上渲染多边形和椭圆,它们会在每个多边形点上精确渲染,一切都很完美。此外,canvas 不支持stretch.Uniform。而且我需要动态地将多边形拟合到它的父对象中。

我的问题是,如何使用点位置数据在自动调整大小的多边形上渲染椭圆?

【问题讨论】:

    标签: c# wpf coordinates polygon


    【解决方案1】:

    你必须考虑另外两件事。

    首先,Grid 可以根据其 Horizo​​ntalAlignment 和 VerticalAlignment 属性对齐(即移动)整个拉伸的多边形。如果您不想自己计算,可以通过myPolygon.TransformToAncestor(grid) 获取适当的 GeneralTransform 对象:

    var polygonGeometryTransform = myPolygon.RenderedGeometry.Transform;
    var polygonToGridTransform = myPolygon.TransformToAncestor(gridPoly);
    
    foreach (var point in myPolygon.Points)
    {
        var transformedPoint = polygonToGridTransform.Transform(
                               polygonGeometryTransform.Transform(point));
        CreateEllipse(5, 5, transformedPoint.X, transformedPoint.Y, gridPoly);
    }
    

    其次,当您对椭圆相对于网格的左上角进行绝对定位时,您必须将它们的 Horizo​​ntalAlignment 设置为 Left 并将 VerticalAlignment 设置为 Top

    ellipse.HorizontalAlignment = HorizontalAlignment.Left;
    ellipse.VerticalAlignment = VerticalAlignment.Top;
    grid.Children.Add(ellipse);
    

    也就是说,您通常不会为绝对定位设置元素的边距。为 Ellipses 使用单独的 Canvas 并设置它们的 Canvas.LeftCanvas.Top 属性会更简洁。

    【讨论】:

    • 现在一切正常,谢谢。当我在多边形创建方法之后第一次将椭圆添加到网格时,它会采用原始​​位置。我认为是因为多边形尚未在此刻度中渲染。如果我使用按钮单独执行此操作,则多边形已渲染并采用新的拉伸位置。您知道一种方法,无需单独单击按钮即可完成这两项操作?
    • 您可以在 Grid 的 SizeChanged 事件处理程序中执行此操作(无论如何您都必须这样做)。但是,请确保在添加新省略号之前删除所有现有的省略号。
    • 对,没想到。再次感谢。现在我终于可以完成我的项目了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2018-01-31
    • 2021-02-19
    相关资源
    最近更新 更多