为什么我的多边形绘制在错误的位置?

时间:2018-10-17 06:14:48

标签: c# wpf xaml polygon

我正在练习C#基本WPF / XAML绘图以进行分配,并且一无所获,我无法弄清楚为什么在错误的位置绘制了多边形。

我的窗口固定为1280x720,不可调整大小。我正在尝试通过以下方式以编程方式创建多边形:

  1. 在坐标中创建点,我希望它们是: `

    • [0,0]
    • [最大高度,0],
    • [最大高度,最大宽度],
    • [0,最大宽度],
    • [最大高度/ 2,最大宽度/ 2]

`

  1. 创建由[0,0]和两个边各三个点组成的多边形。我的屏幕应该分成四个三角形。

我尝试将代码分解为非常明确的内容,以查看是否可以找出问题所在,所以这就是我要解决的问题:

private void CreatePolygons()
{ 
    List<Point> PointList = new List<Point>
    {
        new Point(MainUI.Height / 2, MainUI.Width / 2),
        new Point(0, 0),
        new Point(0, MainUI.Height),
        new Point(MainUI.Width, MainUI.Height),
        new Point(MainUI.Width, 0)                
    };

    Polygon p1 = new Polygon();
    Polygon p2 = new Polygon();
    Polygon p3 = new Polygon();
    Polygon p4 = new Polygon();

    p1.Points.Add(PointList[0]);
    p1.Points.Add(PointList[1]);
    p1.Points.Add(PointList[2]);

    p2.Points.Add(PointList[0]);
    p2.Points.Add(PointList[2]);
    p2.Points.Add(PointList[3]);

    p3.Points.Add(PointList[0]);
    p3.Points.Add(PointList[3]);
    p3.Points.Add(PointList[4]);

    p4.Points.Add(PointList[0]);
    p4.Points.Add(PointList[4]);
    p4.Points.Add(PointList[1]);

    p1.Stroke = System.Windows.Media.Brushes.LightSkyBlue;
    p2.Stroke = System.Windows.Media.Brushes.LightSkyBlue;
    p3.Stroke = System.Windows.Media.Brushes.LightSkyBlue;
    p4.Stroke = System.Windows.Media.Brushes.LightSkyBlue;

    p1.StrokeThickness = 1;
    p2.StrokeThickness = 1;
    p3.StrokeThickness = 1;
    p4.StrokeThickness = 1;

    MainGrid.Children.Add(p1);
    MainGrid.Children.Add(p2);
    MainGrid.Children.Add(p3);
    MainGrid.Children.Add(p4);
}

最终结果是一个完全错位的网格,我不明白它最终创建的坐标是指什么:

Main grid

我想念什么?

3 个答案:

答案 0 :(得分:3)

在第一点上,您意外地交换了WidthHeight

new Point(MainUI.Height / 2, MainUI.Width / 2),

应该是:

new Point(MainUI.Width / 2, MainUI.Height / 2),

另外,假设MainUI是应用程序窗口本身,则点仍会有点偏离,因为窗口的Height包含其标题栏高度。您最好使用MainGrid.ActualWidthMainGrid.ActualHeight

List<Point> PointList = new List<Point>
{
    new Point(MainGrid.ActualWidth / 2, MainGrid.ActualHeight / 2),
    new Point(0, 0),
    new Point(0, MainGrid.ActualHeight),
    new Point(MainGrid.ActualWidth, MainGrid.ActualHeight),
    new Point(MainGrid.ActualWidth, 0)
};

答案 1 :(得分:1)

除了混淆了第一点的宽度和高度外,我建议不要在后面的代码中创建诸如多边形之类的UI元素。最好像这样使用ItemsControl:

<Grid SizeChanged="MainUISizeChanged">
    <ItemsControl x:Name="polygons">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Polygon Stroke="LightSkyBlue" StrokeThickness="1"
                         Points="{Binding}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

,并将其ItemsSource属性分配给PointCollections的集合,例如每当MainUI元素的大小更改时:

private void MainUISizeChanged(object sender, SizeChangedEventArgs e)
{
    var points = new List<Point>
    {
        new Point(e.NewSize.Width / 2, e.NewSize.Height / 2),
        new Point(0, 0),
        new Point(0, e.NewSize.Height),
        new Point(e.NewSize.Width, e.NewSize.Height),
        new Point(e.NewSize.Width, 0)
    };

    polygons.ItemsSource = new List<PointCollection>
    {
        new PointCollection(new Point[] { points[0], points[1], points[2] }),
        new PointCollection(new Point[] { points[0], points[2], points[3] }),
        new PointCollection(new Point[] { points[0], points[3], points[4] }),
        new PointCollection(new Point[] { points[0], points[4], points[1] }),
    };
}

答案 2 :(得分:1)

作为所有多边形点计算的替代方法,您可以使用以下简单的Path元素,该元素会产生相同的输出并自动拉伸:

<Grid>
    <Path Stretch="Fill" Stroke="LightSkyBlue" StrokeThickness="1"
          Data="M0,0 L1,0 1,1 0,1Z M0,0 L1,1 M0,1 L1,0"/>
</Grid>