【问题标题】:How to draw a rectangle in WPF at a specific x,y screen location?如何在 WPF 中的特定 x,y 屏幕位置绘制一个矩形?
【发布时间】:2012-10-06 20:13:14
【问题描述】:

在 C#、WPF 中我创建了一个矩形:

        Rectangle myRgbRectangle = new Rectangle();
        myRgbRectangle.Width = 1;
        myRgbRectangle.Height = 1;
        SolidColorBrush mySolidColorBrush = new SolidColorBrush();

是的,我真的只是希望它是 1 像素乘 1 像素。我想根据可变高度更改颜色,如下所示:

        mySolidColorBrush.Color = Color.FromArgb(255, 0, 0, (byte)height);
        myRgbRectangle.Fill = mySolidColorBrush;

现在,我如何在屏幕上的特定 x,y 位置绘制?我的 MainWindow.xaml 上有一个网格 (myGrid)。

谢谢!


以下是相关代码:

        myRgbRectangle.Width = 1;
        myRgbRectangle.Height = 1;
        SolidColorBrush mySolidColorBrush = new SolidColorBrush();

        int height;
        for (int i = 0; i < ElevationManager.Instance.heightData.GetLength(0); i++)
            for (int j = 0; j < ElevationManager.Instance.heightData.GetLength(1); j++)
            {
                height = ElevationManager.Instance.heightData[i, j] / 100;
                // Describes the brush's color using RGB values. 
                // Each value has a range of 0-255.
                mySolidColorBrush.Color = Color.FromArgb(255, 0, 0, (byte)height);
                myRgbRectangle.Fill = mySolidColorBrush;

                myCanvas.Children.Add(myRgbRectangle);
                Canvas.SetTop(myRgbRectangle, j);
                Canvas.SetLeft(myRgbRectangle, i);

它抛出了这个错误:指定的视觉已经是另一个视觉的孩子或 CompositionTarget 的根。

【问题讨论】:

  • 你要创建多少个这样的 1 像素矩形?
  • 一大堆这些 3600 x 3600。我真的只想绘制彩色像素。
  • 嗯,这大约是 1300 万个矩形。不可能的!并且您已经对上一个问题得到了答案(作为评论):WriteableBitmaponly 明智的方法。
  • 我不明白为什么这是不可能的。我被告知 WriteableBitmap 有内存泄漏。另外,我不能使用“不安全”的代码。
  • 这仅仅是因为 WPF 是关于矢量图形的。它试图摆脱像素并通过填充区域绘制所有内容,这些区域具有由浮点坐标定义的边界。见Graphics and Multimedia

标签: wpf draw rectangles


【解决方案1】:

您需要使用Canvas 而不是Grid。您使用坐标来定位 Canvas 中的元素,而不是 Grid 中的列和行。

画布的定义:

定义一个区域,您可以在其中使用相对于 Canvas 区域的坐标显式定位子元素。

然后您将使用 Canvas.SetTopCanvas.SetLeft 这样的属性(假设您的画布名为 myCanvas):

 myCanvas.Children.Add(myRgbRectangle);
 Canvas.SetTop(myRgbRectangle, 50);
 Canvas.SetLeft(myRgbRectangle, 50);

编辑

根据您的编辑,就像我说您不止一次添加同一个矩形一样。每次添加时都需要在 For 循环中创建它。像这样。

for (int i = 0; i < ElevationManager.Instance.heightData.GetLength(0); i++) 
    for (int j = 0; j < ElevationManager.Instance.heightData.GetLength(1); j++) 
    { 
        Rectangle rect = new Rectangle();
        rect.Width = 1;
        rect.Height = 1;
        height = ElevationManager.Instance.heightData[i, j] / 100; 
        // Describes the brush's color using RGB values.  
        // Each value has a range of 0-255. 
        mySolidColorBrush.Color = Color.FromArgb(255, 0, 0, (byte)height); 
        rect.Fill = mySolidColorBrush; 

        myCanvas.Children.Add(rect); 
        Canvas.SetTop(rect, j); 
        Canvas.SetLeft(rect, i); 
    }

【讨论】:

  • 我也有一个画布,“myCanvas”。如何在画布中明确定位矩形的 x,y?
  • 抛出此错误:指定的视觉对象已经是另一个视觉对象的子对象或 CompositionTarget 的根。有什么想法吗?
  • @zetar 你已经把你的矩形添加到另一个容器对象了吗?
  • 我更新了原始问题,以便您可以看到所有代码...不,我认为矩形没有添加到另一个 Container 对象中。
  • @zetar 在我所做的测试中,绘制 100x100 点大约需要 20 秒,所以如前所述,您可能应该使用WritableBitmap
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多