前回の学習では、WPFのアウトラインを俯瞰してみましたが、抽象的過ぎて何の役にも立たない「知ったかぶり知識」でした。プログラミングにおける「役に立つ知識」とは「プログラムを書ける能力」に直結していないと、ですよね?
では「即戦力」観点から学習するにはどうしたらよいのか?「習うより慣れろ」の原則に立ち返るべきなんでしょうね。まずは「単なるウィンドウを作る」所から始めましょう。まずは慣れ親しんだWinFormでのウィンドウだけのプログラムから。
【WinFormでの最小ウィンドウプログラム】
/////////////
// Form01.cs
/////////////
using System;
using System.Windows.Forms;
namespace Form01
{
class MyApp : Form
{
[STAThread]
public static void Main()
{
Application.Run(new MyApp());
}
}
}
WPFでこれと同じようなことをやってみます。
【WPFの最小ウィンドウプログラム】
/////////////
// Window01.cs
/////////////
using System;
using System.Windows;
namespace Window01
{
class MyApp : Window
{
[STAThread]
public static void Main()
{
Application.Run(new MyApp());
}
}
}
最初のエラーメッセージが、
「Window01.cs(9,16): error CS0246: 型または名前空間名 'Window' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。」
だったので、WPFプログラムに最小限必要な(注)
RefFile=C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\WindowsBase.dll
RefFile01=C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationCore.dll
RefFile02=C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll
RefFile03=C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Xaml.dll(注)
をMSCompAssの「参照ファイル」に追加します。
(注)最初はエラーメッセージを出しながら、その内容やMS Leraningで調べて、やっとこさこの4つが必要であることを暴きました。特に困ったのがSystem.Xaml.dllで、「俺はXamlは使わないから」と無視したら、PresentationFramework.dllが参照しているので「'System.Windows.Markup.IQueryAmbient' が参照されていないアセンブリで定義されています。アセンブリ 'System.Xaml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' への参照を追加してください。」というエラーが出てしまいました。従って、WPFプログラミングでは、このSystem.Xamlへの参照は不可欠であると考えてください。
さあこれでよいだろう、とコンパイルしたらまた「静的でないフィールド、メソッド、またはプロパティ 'System.Windows.Application.Run(System.Windows.Window)' で、オブジェクト参照が必要です」というエラーが出ます。(注)
注:参照しているのは、またPresentationFramework.dllです。ご存じの通り、このエラーはC++でいうところのポインターがnullで、インスタンスの実体がメモリーに存在しない場合に出ます。WinFormの場合はApplicationクラスに静的なメソッドがあったのでコンパイラー通りましたが、WPFでは静的なメソッドがないので通らなかったことになります。
しょうがないので、↑の紫字部分を
Application Myapp = new Application();
Myapp.Run(new MyApp());
と書き換えてコンパイルすると、
やっとこさ、サイズが大きめの、クライアントエリア色が異なるウィンドウが表示されました。(ここら辺から私は、「両者は似たようで非なるものだ」という印象を強くしていきます。)