WPFでプログラムしてみよう(1)


久しぶりに新しいことに手を出してみようと思います。今回はテーマをWPFに絞って3回くらいに分けて記事をまとめます。
使うテキストはこちらです。


Windows Presentation Foundation プログラミング入門

Windows Presentation Foundation プログラミング入門


これ一冊をしっかりと勉強して、WPFで何かアプリケーションを作ってみることを最終目的に掲げます。
何を作るのかは、やっていきながら考えます。

分類 私の環境
OS Windows Vista SP1
Framework .NET Framework3.5
editor gvim 7.1

第1章 .NET FrameworkとWPF

WPFの概要についてと開発環境の作成方法について書いてあります。
WPFは.NET Framework3.0からの機能であることや元々WinFXというコードネームで開発されていたということが簡単に説明してあります。
開発環境の作成方法を見て、初めてIDEを使わない前提の本であることを知りました。
敷居を低くするのが狙いのようですが、どうせExpress Editionはただなんだからそれを入れさせればいいのに...。

開発環境の作成については、私のPCには既にVS.NET 2008 Standardが入っているので、そのツールのひとつとしてインストールされているVS.NET用のコマンドプロンプトを私用することにしました。これであればわざわざPATHを通したりする必要はありません。



ただ、参照するモジュールについての設定だけは必要なので行いました。方法は以下の通りです。

    • explorerを開く
    • フォルダを開く (C:\Windows\Microsoft.NET\Framework\v3.5)
    • このフォルダ内にあるcsc.rspをメモ帳で開く
    • 以下のように追記する

  

    • csc.rspを保存する(読み取り専用やアクセス権で保存できない場合はそれを解消)


これでコンパイラのオプションにWPF用の参照を追記しなくても済みます。便利。

第2章 ウィンドウアプリケーション

この章から実際にサンプルを書いてコンパイルして動かしてみます。
とは言っても全部試す必要もなくて適当なサンプルを作って試してみます。

ウィンドウを表示するだけの簡単なサンプル
using System;
using System.Windows;
using System.Windows.Media;

class Test {
	[STAThread]
	public static void Main(){
		Window wnd   = new Window();

		wnd.Topmost  = true;

		wnd.Width    = 200;
		wnd.Height   = 200;

		wnd.Content  = "ほげほげ";

		wnd.FontSize = 30;
		wnd.Background = Brushes.Red;
		wnd.FontFamily = new FontFamily("HG行書体");
		wnd.FontStyle  = FontStyles.Italic;

		Application app = new Application();
		app.Run(wnd);
	}
}


これを保存してコンパイルしてみます。


で、出来たプログラムを実行すると赤いフォームが表示されます。



正直、この程度であればWPFを使わなくてもWindowsアプリケーションで作れるし、書く内容だってほとんど一緒。うーん....。

統合されたUI要素
    1. 可視化されるものは全部System.Windows.UIElementクラスを継承してる
    2. 線とか図形は描画するんじゃなくてオブジェクトとして利用する


サンプルが載ってたのでちょっといじって動かしてみました。

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Controls;
using System.Windows.Shapes;

class Test {
	[STAThread]
	public static void Main(){
		CheckBox chkBox1 = new CheckBox();
		chkBox1.Content  = "チェックボックス";
		chkBox1.FontSize = 20;

		Ellipse elp1     = new Ellipse();
		elp1.Width       = 200;
		elp1.Height      = 100;
		elp1.Fill        = Brushes.Red;

		Label lbl1       = new Label();
		lbl1.FontSize    = 30;
		lbl1.Content     = "This is Label";

		StackPanel pnl1  = new StackPanel();
		pnl1.Children.Add(chkBox1);
		pnl1.Children.Add(elp1);
		pnl1.Children.Add(lbl1);

		Button btn1      = new Button();
		btn1.Content     = pnl1;

		Canvas cnvs      = new Canvas();
		cnvs.Children.Add(btn1);

		Window wnd = new Window();
		wnd.Content      = cnvs;

		Application app = new Application();
		app.Run(wnd);

	}
}


で、コンパイルして実行。


ウィンドウの中にボタンがあってその中に楕円やチェックボックスが描画されています。
何となく今までのWindowsアプリケーションとの違いが見えてきました。

依存プロパティ

オブジェクトが動的(実行時)に状況に応じて使用するためのプロパティを依存プロパティと呼ぶそうです。

using System;
using System.Windows;

class Test {

	public static DependencyProperty LactProperty;
	static Test(){
		LactProperty = DependencyProperty.Register (
				"Lact",typeof(String),typeof(Test)
		);
	}

	[STAThread]
	public static void Main() {
		Window wnd = new Window();

		wnd.FontSize = 30;
		wnd.SetValue(LactProperty,"after change");
		wnd.Content  = wnd.GetValue(LactProperty);

		Application app = new Application();
		app.Run(wnd);
	}
}

で、これもコンパイルして実行。


とりあえず使い方は分かったので終わり。使いどころはこれからかな...。


アタッチプロパティ

依存プロパティの一種で、使うクラスに情報を付加するといった用途などで持たせるプロパティをアタッチプロパティと呼びます。
とりあえずサンプルを書いてみます。

using System;
using System.Windows;

class TagManager {
	public static readonly DependencyProperty TagProperty ;
	static TagManager(){
		TagProperty = DependencyProperty.RegisterAttached(
				"Tag", typeof(String), typeof(TagManager)
				);
	}

	public static void SetTag(UIElement element, string value){
		element.SetValue(TagProperty, value);
	}

	public static String GetTag(UIElement element){
		return (string)element.GetValue(TagProperty);
	}
}

class Test {
	[STAThread]
	public static void Main(){
		Window wnd = new Window();
		TagManager.SetTag(wnd, "タイトル");
		wnd.Title = TagManager.GetTag(wnd);

		Application app = new Application();
		app.Run(wnd);
	}
}


コンパイルして実行するとこんな感じ。


使い方は分かりましたが、説明を読んだ感じと印象がちょっと異なっているように感じました。これだとTagManagerクラスが単に属性の管理クラスになっているだけみたいです。
これも使っていきながら感覚をつかみます。



これで2章は終わり。明日からは3章のパネルとレイアウトと4章の描画オブジェクトを勉強します。