図形1

WPFで、円や四角形や線分などを描く方法についてまとめる。

WPFアプリの構成

WPFでは、初めから、二つのファイル

MainWindow.xaml (XAMLファイル)

MainWindow.xaml.cs (C#ファイル)

が用意されている。ファイル名が紛らわしいが、後者はC#のファイルとなっている。

二つのファイルを編集してWPFアプリは作られるが、今回はXAMLファイルはほとんどふれず、 C#を中心に基本的な図形を描くアプリを作成する。

準備

XAMLファイルにはあまり触れないと宣言したが、少しだけ変更を加える。 最初、MainWindow.xamlを開くと

<Window x:Class="WpfZukei.MainWindow"
        ~省略~
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        
    </Grid>
</Window>

となっているが、Gridに次のように名前を付ける。

<Window x:Class="WpfZukei.MainWindow"
        ~省略~
        Title="MainWindow" Height="450" Width="800">
    <Grid Name="grid1">
        
    </Grid>
</Window>

Gridは各種GUIの部品を「格子の上に配置する」ためのものであるが、 今はその「格子的」機能をほとんど使用しない(1×1の格子とみなす)ので、 「GUI部品を配置する土台となるもの」という理解だけをしておく。

このグリッドの中に、図形を描くためのキャンバスを入れて、その中に図形を描く。

Canvas(キャンバス)

以下は、MainWindow.xaml.csという「C#」ファイルに変更を加えていく。

MainWindowクラスのコンストラクタに注目し、この部分を次のように変更する。

public MainWindow(){
    InitializeComponent();
    Canvas canvas1 = new Canvas();
    canvas1.Background = Brushes.LightBlue;
    grid1.Children.Add(canvas1);
}

実行結果.

ライトブルーのWindowが出現する。
(正確にいえば、ライトブルーのキャンバスを持ったWindowが表示される。)

楕円

楕円を描くには、Ellipseというクラスを用いる。この楕円は、canvas1の中の子要素として追加する。

public MainWindow()
{
    InitializeComponent();
    Canvas canvas1 = new Canvas();
    grid1.Children.Add(canvas1);
    Ellipse ellipse1 = new Ellipse();
    ellipse1.Width = 60;
    ellipse1.Height = 60;
    ellipse1.Stroke = Brushes.Black;
    Canvas.SetLeft(ellipse1, 100);
    Canvas.SetTop(ellipse1, 100);
    canvas1.Children.Add(ellipse1);
}

実行結果.

解説

最初の「InitializeComponent()」は初めから入力されいてるもので、Windowの初期化処理を行う部分である。

grid1.Children.Add(canvas1);  

では、土台となるgrid1にcanvas1を子要素として追加している。

ellipse1.Width = 60;
ellipse1.Height = 60;

では、楕円の横と縦の幅を指定している。

ellipse1.Stroke = Brushes.Black;

では、楕円の境界の色を定めている。

Canvas.SetLeft(ellipse1, 100);
Canvas.SetTop(ellipse1, 100);

では、ellipse1のcanvas1上での位置を「左から100」「上から100」に設定している。 ただし、このellipse1の座標は、楕円の中心座標ではなく、外接する長方形の左上の座標となるので注意が必要。

四角形

四角形を描くには、Rectangleというクラスを用いる。使用法は楕円とほぼ同じ。

public MainWindow()
{
    InitializeComponent();
    Canvas canvas1 = new Canvas();
    grid1.Children.Add(canvas1);
    Rectangle rectangle1 = new Rectangle();
    rectangle1.Width = 160;
    rectangle1.Height = 130;
    rectangle1.Fill = Brushes.Gray;
    Canvas.SetLeft(rectangle1, 100);
    Canvas.SetTop(rectangle1, 100);
    canvas1.Children.Add(rectangle1);
}

実行結果.