web-dev-qa-db-ja.com

特定のx、y画面の場所にWPFで長方形を描画するにはどうすればよいですか?

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のルートです。

8
zetar

Canvas の代わりに Grid を使用する必要があります。座標を使用して、要素をCanvasに配置し、列と行をGridに配置します。

キャンバスの定義:

Canvas領域に相対的な座標を使用して、子要素を明示的に配置できる領域を定義します。

次に、 Canvas.SetTop および Canvas.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); 
    }
18
Mark Hall