質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

4901閲覧

WPF canvasにEllipseを追加する時の位置指定方法

Arumi

総合スコア5

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/02/25 02:20

前提・実現したいこと

C#,WPFでcanvasに指定した座標に点を描画したい為、
Ellipseを使おうと思いましたが、canvasの左上にしか描画できません。

指定した座標に描画する方法を教えてください・・・。
Ellipse以外で指定した座標を描画する方法がありましたら教えて頂けると助かります。
lineを使用して線ではなく、点で描画したいです。

理解度が低い状態で作成をしておりますので、初歩的な誤りがあるかもしれませんが、
宜しくお願いします。

該当のソースコード 断片的に抜き出しています。

C#

1 Style gridStyle = this.FindResource("GridStyle") as Style; 2       //座標を変数に代入 3 for (i = 0; i < count;i++) 4 { 5 DataX_s[i] = 100 + i; 6 DataY_s[i] = 300; 7 } 8 9 for (i = 0; i < count; i++) 10 { 11 Ellipse ell = new Ellipse() 12 { 13   //この辺でX,Y座標を指定する・・・? 14 Style = gridStyle, 15 }; 16 canvas.Children.Add(ell); 17 }

XAML

1<Window.Resources> 2 <Style x:Key="GridStyle" TargetType="Ellipse"> 3 <Setter Property="StrokeThickness" Value="1" /> 4 <Setter Property="Stroke" Value="Black" /> 5 <Setter Property="SnapsToDevicePixels" Value="True" /> 6 <Setter Property="Width" Value="1"/> 7 <Setter Property="Height" Value="1"/> 8 </Style> 9</Window.Resources> 10 11<Grid Width="700" Margin="0,0,-1,0" HorizontalAlignment="Left" VerticalAlignment="Top" Height="520"> 12  <Canvas x:Name="canvas" Background="White" Margin="0,0,0,0" Width="550" Height="300"/> 13</Grid

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/02/25 02:28 編集

先のご質問と求めるところは実質、同じですね。 「WPF Canvasに指定した座標を黒く描画することができない。(lineなどで線ではなく指定した座標のみ)」 https://teratail.com/questions/243339 初心者の方のようですので強く非難はしたくありませんが、推奨される行為ではありませんので、teratail運営に先の質問の削除依頼を出しましょう。(あるいは先の質問を適切に編集して、この質問の削除依頼を出してください)回答がつくと削除依頼ができなくなります。
Arumi

2020/02/25 02:30

削除リクエストしておきました
guest

回答2

0

ベストアンサー

動作検証した関係でusing以外全文貼り付けします。

C#

1 2namespace CanvasTest 3{ 4 /// <summary> 5 /// MainWindow.xaml の相互作用ロジック 6 /// </summary> 7 public partial class MainWindow : Window 8 { 9 int count = 10; 10 double[] DataX_s; 11 double[] DataY_s; 12 13 public MainWindow() 14 { 15 InitializeComponent(); 16 17 DataX_s = new double[count]; 18 DataY_s = new double[count]; 19 20 Style gridStyle = this.FindResource("GridStyle") as Style; 21 //座標を変数に代入 22 for (var i = 0; i < count; i++) 23 { 24 // 1ずつのインクリメントではべた塗りになってしまったので20ずつ増やします。 25 DataX_s[i] = 100 + i * 20; 26 27 // ここが問題でした。canvasのHeightが300なのにEllipseの左上点Y座標が300だったので、canvasの外側に描画されていました。 28 DataY_s[i] = 100; 29 } 30 31 for (var i = 0; i < count; i++) 32 { 33 Ellipse ell = new Ellipse() 34 { 35 //この辺でX,Y座標を指定する・・・? 36 Style = gridStyle, 37 }; 38 canvas.Children.Add(ell); 39 40 // この2行を追加で左上座標を設定できると思います。 41 Canvas.SetLeft(ell, DataX_s[i]); 42 Canvas.SetTop(ell, DataY_s[i]); 43 } 44 } 45 } 46} 47

C#

1DataY_s[i] = 300;

になっていたので、canvasの下方向外側に描画していたようです。

XAML

1<Window x:Class="CanvasTest.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:CanvasTest" 7 mc:Ignorable="d" 8 Background="Gray" 9 Title="MainWindow" Height="450" Width="800"> 10 <Window.Resources> 11 <Style x:Key="GridStyle" TargetType="Ellipse"> 12 <Setter Property="StrokeThickness" Value="1" /> 13 <Setter Property="Stroke" Value="Black" /> 14 <Setter Property="SnapsToDevicePixels" Value="True" /> 15 <Setter Property="Width" Value="50"/> 16 <Setter Property="Height" Value="50"/> 17 </Style> 18 </Window.Resources> 19 <Grid> 20 <Canvas Name="canvas" 21 Background="White" 22 Margin="0,0,0,0" 23 Width="550" 24 Height="300"/> 25 </Grid> 26</Window>

XAML

1<Setter Property="Width" Value="50"/> 2<Setter Property="Height" Value="50"/>

Ellipseの幅と高さも変更しました。
Value="1"でも表示されないことはないですが、高さ幅1ピクセルなので点になると思います。

投稿2020/02/25 11:03

quadii.shii

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Arumi

2020/02/26 00:47

動作検証までありがとうございます。 元々答えを頂いていたのにも関わらずこんな初歩的なミスをしてしまっていたのですね・・・。 本当に助かりました、ありがとうございます!
guest

0

動作検証はしておりませんが…

cs

1Style gridStyle = this.FindResource("GridStyle") as Style; 2       //座標を変数に代入 3for (i = 0; i < count;i++) 4{ 5 DataX_s[i] = 100 + i; 6 DataY_s[i] = 300; 7} 8 9for (i = 0; i < count; i++) 10{ 11 Ellipse ell = new Ellipse() 12 { 13   //この辺でX,Y座標を指定する・・・? 14 Style = gridStyle, 15 }; 16 canvas.Children.Add(ell); 17 18 // この2行を追加で左上座標を設定できると思います。 19 Canvas.SetLeft(ell, DataX_s[i]); 20 Canvas.SetTop(ell, DataY_s[i];) 21}

【修正】
失礼いたしました。

cs

1canvas.SetLeft(ell, DataX_s[i]); 2canvas.SetTop(ell, DataY_s[i];)

ではなく、

cs

1Canvas.SetLeft(ell, DataX_s[i]); 2Canvas.SetTop(ell, DataY_s[i];)

でした。

SetLeftおよびSetTopはcanvasというインスタンス名でアクセスできるインスタンスメソッドではなく、Canvas.SetLeft()というようにクラス名でアクセスするクラスメソッドでした。

Javaでいうところのstatic(静的)メソッドにあたります。

申し訳ございませんでした。

投稿2020/02/25 07:50

編集2020/02/25 10:35
quadii.shii

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Arumi

2020/02/25 08:09

回答ありがとうございます! canvas.SetLeft(ell, DataX_s[i]);と記載するとインスタンス参照でアクセスできません~。とエラーになり。 Canvas.SetLeft~~ に変更するとエラーは出ませんが、左上にさえ表示されなくなってしまいます・・・。
TN8001

2020/02/25 08:50

DataY_s[i] = 100; 位にしたら出るんじゃないですか。 正確には Canvas.SetLeft(ell, DataX_s[i] - ell.Width / 2); じゃないかと思いますが、Width=1だと変わんないかもしれませんね。 大量にEllipseが追加されるなら、OnRenderで自分で描いたほうがいいかもしれません。
quadii.shii

2020/02/25 10:38

クラスメソッド間違い、インスタンスメソッドは回答を修正しました。 表示されない件は別の理由であると思いますので、精読してみます。
Arumi

2020/02/26 00:48

TN8001さん、ありがとうございます。 大量に追加される可能性もあるので、OnRenderについて調べてみます。 情報ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問