連載:XAMLの基礎知識

第2回 XAMLとWPFの関係

デジタルアドバンテージ 遠藤 孝信
2008/02/15
Page1 Page2 Page3

ウィンドウをXMALではなくC#/VBで記述

 いまイベント・ハンドラだけをC#/VBで記述しましたが、続いてはウィンドウの定義であるwin.xamlの内容をすべてC#/VBで記述してみましょう。

 といってもそれほど難しくなく、先ほどイベント・ハンドラを記述したリスト5にHelloWorldWindowクラスのコンストラクタを追加し、そこでウィンドウの初期設定を行うだけです。具体的には、ウィンドウのプロパティ設定と、ボタンの作成/追加を行います。このファイル名はwin.cs/win.vbとします。

using System.Windows;
using System.Windows.Controls;

public class HelloWorldWindow : Window {


  public HelloWorldWindow() { // コンストラクタ

    this.Title = "My First XAML";
    this.Width = 320;
    this.Height = 240;

    Button button = new Button();
    button.Content = "Click Me!"; // ボタンのキャプションを設定
    button.Width = 100;
    button.Height = 50;
    button.Click += HelloWorldWindow_Click;

    this.Content = button; // ボタンをウィンドウに追加
  }

  void HelloWorldWindow_Click(object sender, RoutedEventArgs e) {
    MessageBox.Show("クリックされました!");
  }
}

Imports System.Windows
Imports System.Windows.Controls

Partial Public Class HelloWorldWindow
    Inherits Window


  Public Sub New() ' コンストラクタ

    Me.Title = "My First XAML"
    Me.Width = 320
    Me.Height = 240

    Dim button As New Button()
    button.Content = " Click Me!" ' ボタンのキャプションを設定
    button.Width = 100
    button.Height = 50
    AddHandler button.Click, AddressOf HelloWorldWindow_Click

    Me.Content = button ' ボタンをウィンドウに追加
  End Sub

  Sub HelloWorldWindow_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    MessageBox.Show("クリックされました!")
  End Sub
End Class

リスト7 win.xamlの内容をC#/VBで記述したコード(上:win.cs、下:win.vb)

 XAMLで<Window>要素の属性として記述していた「Title」や「Width」「Height」などは、Windowクラスのプロパティとして記述します。また、<Button>要素のClick属性は、ButtonクラスではClickイベントに対応しています。このリスト7の構造は従来のWindowsフォームでのウィンドウとほぼ同じといえるでしょう。

 ただしContentプロパティは少しだけ特殊で、これにはまさにコントロールのコンテンツ(=内容)となるものを指定します。XAML上では<Window>タグと</Window>タグ、<Button>タグと</Button>タグで囲まれていた内容が、実はContentプロパティの内容となります。コンテンツがコントロールのどの部分の内容になるかはコントロールによって異なります。

 なお、もはや部分クラスを使う必要はありませんので、リスト7ではpartialキーワードを削除しています。

アプリケーション定義におけるメソッド呼び出し

 いま作成したリスト7だけでは、まだビルドはできません。続いては、リスト7で記述したHelloWorldWindowクラスのインスタンス化について考える必要があります。

 ここまでは、リスト2に示したアプリケーションの定義において、<Application>要素のStartupUri属性にwin.xamlを指定することにより、ウィンドウのインスタンス化が可能でした。しかし、ここではもはやwin.xamlは使用しませんので、HelloWorldWindowクラスを“New”するコードを実行する必要があります。

 <Application>要素に対応するSystem.Windows名前空間のApplicationクラスには、アプリケーション開始時に発生する「Startupイベント」が用意されているため、これを使いましょう。つまり、先ほどのボタンのClickイベントと同様の手法により、Startupイベントのイベント・ハンドラをC#/VBで記述し、そこでウィンドウのインスタンス化を行います。

 まず、<Application>要素に対しては、x:Class属性でアプリケーションのクラス名を指定し、Startup属性にイベント・ハンドラとなるメソッド名を指定します。

<Application
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="HelloWorldApp"
  Startup="HelloWorldApp_Startup"
/>
リスト8 Startupイベントを追加したapp.xaml

 このXAMLファイルのコードビハインド・ファイルは次のようになります。HelloWorldWindowクラスをインスタンス化し、そのShowメソッドによりウィンドウを表示するだけです。

using System.Windows;

public partial class HelloWorldApp : Application
{
  void HelloWorldApp_Startup(object sender, StartupEventArgs e)
  {
    HelloWorldWindow win = new HelloWorldWindow();
    win.Show();
  }
}
Imports System.Windows

Partial Public Class HelloWorldApp
    Inherits Application
  Sub HelloWorldApp_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
    Dim win As New HelloWorldWindow()
    win.Show()
  End Sub
End Class
リスト9 Startupイベントを追加したapp.xamlのコードビハインド・ファイル(上:app.xaml.cs、下:app.xaml.vb)

 そして、リスト7〜9をビルドするためのプロジェクト・ファイルは次のようになります。

<Project
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
    DefaultTargets="Build" >

  <PropertyGroup>
    <AssemblyName>HelloWorld</AssemblyName>
    <OutputType>winexe</OutputType>
    <OutputPath>.\</OutputPath>
  </PropertyGroup>

  <ItemGroup>
    <ApplicationDefinition Include="app.xaml" />

    <Compile Include="app.xaml.cs" />
    <Compile Include="win.cs" />

    <Reference Include="System" />
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
  </ItemGroup>

  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />

</Project>

<Project
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
    DefaultTargets="Build" >

  <PropertyGroup>
    <AssemblyName>HelloWorld</AssemblyName>
    <OutputType>winexe</OutputType>
    <OutputPath>.\</OutputPath>
  </PropertyGroup>

  <ItemGroup>
    <ApplicationDefinition Include="app.xaml" />

    <Compile Include="app.xaml.vb" />
    <Compile Include="win.vb" />

    <Reference Include="System" />
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
  </ItemGroup>

  <Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
  <Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />

</Project>

リスト10 プロジェクト・ファイルhello.proj(上:C#用、下:VB用)
リスト7〜9からHelloWorld.exeを作成するためのプロジェクト・ファイル。


 INDEX
  XAMLの基礎知識
  第2回 XAMLとWPFの関係
    1.コードビハインドによるイベント・ハンドラの記述
  2.ウィンドウをXMALではなくC#/VBで記述
    3.アプリケーション定義をC#/VBで記述
 
インデックス・ページヘ  「XAMLの基礎知識」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間