How to draw a rectangle in WPF at a specific x,y screen location?

draw, rectangles, wpf

Solution

You need to use a `Canvas` istead of a `Grid`. You use coordinates to position elements in a `Canvas` versus Column and Row in a `Grid`.

Definition of a Canvas:

Defines an area within which you can explicitly position child elements by using coordinates that are relative to the Canvas area.

You would then use `Canvas.SetTop` and `Canvas.SetLeft` Properties like this (assuming that your canvas is named `myCanvas`):

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

Edit

Based on your edit, it is like I said you are adding the same rectangle more than once. You need to be creating it in your For Loop each time you add it. Something like this.

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

Problem

In C#, WPF I've created a rectangle: ``` Rectangle myRgbRectangle = new Rectangle(); myRgbRectangle.Width = 1; myRgbRectangle.Height = 1; SolidColorBrush mySolidColorBrush = new SolidColorBrush(); ``` Yes, I really just want it to be 1 pixel by 1 pixel. And I want to change the color based on the variable height like so: ``` mySolidColorBrush.Color = Color.FromArgb(255, 0, 0, (byte)height); myRgbRectangle.Fill = mySolidColorBrush; ``` Now, how do I draw at a specific x,y location on the screen? I do have a grid (myGrid) on my MainWindow.xaml. Thanks! Here's the pertinent code: ``` 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); ``` And it's throwing this error: Specified Visual is already a child of another Visual or the root of a CompositionTarget.

Original source