前回の学習では、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());

と書き換えてコンパイルすると、

やっとこさ、サイズが大きめの、クライアントエリア色が異なるウィンドウが表示されました。(ここら辺から私は、「両者は似たようで非なるものだ」という印象を強くしていきます。)