第3回 XAMLコードから生成されるプログラム・コードを理解する ―― XAML(2): WPF固有機能の基礎 ――:連載:WPF入門(2/4 ページ)
XAMLコードから自動生成される中間生成物のプログラム・コード、依存関係プロパティとルーティング・イベントを解説。WPFの内部的な挙動を理解しよう。
●App.xamlファイルから生成されるプログラム・コード
次に、App.xamlファイル(※VBではApplication.xamlファイル)を見てみよう。App.xamlファイルの分離コードであるApp.xaml.cs/App.xaml.vbファイル内に生成されるAppクラス(※VBではApplicationクラス)は、アプリケーション自身を定義するもので、実体は.Applicationクラス(System.Windows名前空間)を継承したクラスである。MainWindowクラスと同様に、こちらもパーシャル・クラスとなっている。
App.xamlファイルから自動生成される中間生成物のプログラム・コードは、MainWindow.xamlファイルのものとは少し異なる。Visual Studio上でファイルのプロパティを開いて見比べてもらうと、Figure 2に示すように、MainWindow.xamlファイルとApp.xamlファイルで[ビルド アクション]が異なることが分かる。
[ビルド アクション]が「ApplicationDefinition」の場合、自動生成されるプログラム・コード(objフォルダ内に作成される「App.g.cs/Application.g.vb」ファイル)は、List 4に示すようなものになる(先ほどと同様に、説明に不要な属性やコメントは削除している)。
using System.Windows;
namespace SampleWpfApplication
{
public partial class App : Application
{
public void InitializeComponent()
{
this.StartupUri = new System.Uri(
"MainWindow.xaml", System.UriKind.Relative);
}
public static void Main()
{
SampleWpfApplication.App app =
new SampleWpfApplication.App();
app.InitializeComponent();
app.Run();
}
}
}
Imports System.Windows
Partial Public Class Application
Inherits System.Windows.Application
Public Sub InitializeComponent()
Me.StartupUri = New System.Uri( _
"MainWindow.xaml", System.UriKind.Relative)
End Sub
Public Shared Sub Main()
Dim app As Application = New Application()
app.InitializeComponent
app.Run
End Sub
End Class
アプリケーションのエントリ・ポイント(=Mainメソッド)はここで定義されている。
Visual Studioテンプレート生成時の状態では、XAMLコードの内容すべてがプログラム・コード化されており、XAMLコードを実行時にロードする処理が含まれていないが、<Application.Resources>要素の中身を(App.xamlファイルに)追加したりすれば、MainWindow.xamlファイルの場合と同様に、LoadComponentメソッドの呼び出しが追加される。
●System.Windows.Applicationクラス
Applicationクラス(System.Windows名前空間)は、アプリケーションの起点となるクラスで、主に以下のようなイベントを持っている。
- Startup: アプリケーションの起動時(Runメソッド呼び出し直後)に発生する。
- Exit: アプリケーションの終了直前に発生する。
- Activated: アプリケーションがアクティブになった瞬間(ほかのアプリケーションからフォーカスが戻った瞬間)に発生する。
- Deactivated: ほかのアプリケーションにフォーカスが移った瞬間に発生する。
- SessionEnding: ユーザーのログオフや、オペレーティング・システムのシャットダウンによってセッションが終了するときに発生する。
○コマンドライン引数
WPFアプリケーションでは、XAMLコードから自動生成される中間生成物のプログラム・コード中に、Mainメソッドが隠されているため、コマンドライン引数を直接、受け取れない。コマンドライン引数を利用したい場合には、Startupイベントのイベント・ハンドラ内でEnvironmentクラス(System名前空間)のGetCommandLineArgsメソッドを通して受け取る(参考:「.NET TIPS:コマンドライン引数を取得するには?」)。
○アプリケーション・オブジェクトの参照
一般に、ウィンドウをまたいでアプリケーション全体で利用する値などは、Applicationクラス(を継承した自前のアプリケーション・クラス)の中に定義する(ただし、グローバル変数が非推奨とされるのと同様に、アプリケーション全体から参照される値は可能な限り避けるべきである)。ウィンドウ(例えば、Visual Studioのテンプレートで生成されるMainWindowクラスなど)からは、Application.Current静的プロパティを通して現在実行中のアプリケーション・オブジェクトを取得できるため、各ウィンドウがアプリケーション・オブジェクトの参照を持つ必要はない。
さて、次のページからは、依存関係プロパティ(および、添付プロパティ)について説明する。
Copyright© Digital Advantage Corp. All Rights Reserved.