WisdomSoft - for your serial experiences.

2.3 座標とサイズ

WPF におけるウィンドウの座標やサイズの設定方法、および座標系における論理ピクセルの考え方について解説します。

2.3.1 座標を変更する

表示するウィンドウの座標、幅、高さなどは、実行時に自由に変更することができます。座標やサイズは、ユーザーがタイトルバーをドラッグしたり、サイズ変更境界線をドラッグすることでも変更できますが、プログラムから明示的に変更することも可能です。

表示するウィンドウの座標は、Window クラスの Left プロパティTop プロパティで決定されます。

Window クラス Left プロパティ
[TypeConverterAttribute("System.Windows.LengthConverter, PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null")]
public double Left { get; set; }

Left プロパティは、ウィンドウの左隅の座標を表します。ディスプレイの左隅を 0 として、値が大きいほど右に、小さいほど左に移動します。

Window クラス Top プロパティ
[TypeConverterAttribute("System.Windows.LengthConverter, PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, Custom=null")]
public double Top { get; set; }

Top プロパティは、ウィンドウの上隅を表す座標です。ディスプレイの上隅を 0 として、値が大きいほど下に、小さいほど上に移動します。

これらのプロパティには負数を設定することもできます。その場合、ウィンドウの一部が画面から切れるだけで特に問題は発生しません。マルチディスプレイを用いているユーザーが、プライマリ ディスプレイよりも上や左側の方向にディスプレイを配置している場合、座標が負数になることがあります。

2.3.2 サイズを変更する

ウィンドウのサイズを変更したり、レイアウト上の理由から現在のサイズを取得するには Width プロパティHeight プロパティを使います。これらのプロパティは Window クラスのものではなく、基底クラスである FrameworkElement クラスで宣言されているプロパティです。

FrameworkElement クラス Width プロパティ
[TypeConverterAttribute(typeof(LengthConverter))]
[LocalizabilityAttribute(LocalizationCategory.None, Readability=Readability.Unreadable)]
public double Width { get; set; }

Width プロパティは、ウィンドウの幅を設定または取得します。値が大きいほどウィンドウの幅は広くなります。

FrameworkElement クラス Height プロパティ
[LocalizabilityAttribute(LocalizationCategory.None, Readability=Readability.Unreadable)]
[TypeConverterAttribute(typeof(LengthConverter))]
public double Height { get; set; }

Height プロパティは、ウィンドウの高さを設定または取得します。値が大きいほど、ウィンドウは縦に長くなります。

コード1
using System;
using System.Windows;

class Test {
	[STAThread]
	public static void Main() {
		Window wnd = new Window();
		wnd.Left = 100;
		wnd.Top = 100;
		wnd.Width = 400;
		wnd.Height = 300;

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

コード1は、明示的にウィンドウの初期の座標とサイズを設定しています。ウィンドウが表示されてからは、ユーザーがウィンドウを操作することで座標やサイズは変更されてしまいますが、このようにプログラムからウィンドウの座標やサイズを変更することも可能です。通常は、これらのプロパティはウィンドウの現在の座標やサイズを取得する目的に使われることのほうが多いでしょう。

2.3.3 デバイスに依存しないピクセル

WPF の Left や Top、Width や Height プロパティなどに設定する座標系の値は何に対応しているのか、疑問に思ったかもしれません。これらの値は、GDI や GDI+ で一般的に使われていたピクセルと同様であると考えていただいても、ほとんど不都合は無いでしょう。

ただし、正確に表現するならば、WPF で用いられるピクセルは論理的なピクセルであり、物理的なピクセルではありません。これをデバイス非依存ピクセルと呼びます。もしくは、物理ピクセルに対して論理ピクセルと呼ぶこともあります。

WPF で用いられるピクセルは、常に 1/96 インチであると定められています。よって、幅や高さに 96 ピクセルを指定した場合、それは物理的なディスプレイ上で 1 インチの長さを持つことになります。1 インチ上のピクセル数は、物理的な出力デバイスに依存する問題です。WPF は、論理ピクセルの値に基づいて、自動的に物理ピクセルに変換してくれます。

この機能によって、解像度の異なるディスプレイ、システム間でも、まったく同じ長さでオブジェクトが描画されることが保証されます。システムによっては、1 インチに入るピクセル数を表す DPI が異なる場合があります。72dpi のシステムでは 72 ピクセルで 1 インチの長さになりますが、96dpi のシステムでは 1 インチを満たしません。こうした問題は、従来の Windows フォーム アプリケーションでは座標系を変換するなどの対策が必要でしたが、デザインのスペシャリストではない一般的な開発者にとって、座標系の管理作業は負担にしか感じられなかったことでしょう。しかし、WPF では、論理ピクセルによって解決しているのです。

2.3.4 既定の位置

ウィンドウが最初に表示される場所を自動的に計算させることも可能です。既定では、ウィンドウが表示される場所は、Window オブジェクトの Left と Top プロパティに設定されている値に従いますが、WindowStartupLocation プロパティを設定することで、画面の中央に表示させることも可能です。

もちろん、スクリーンの幅と高さとウィンドウの幅と高さを計算することで、手動でウィンドウを画面の中央に配置させることもできます。しかし、WindowStartupLocation を使えば、自動的に画面の中央に配置してくれます。

Window クラス WindowStartupLocation プロパティ
public WindowStartupLocation WindowStartupLocation { get; set; }

WindowStartupLocation プロパティには、System.Windows.WindowStartupLocation 列挙体のメンバのいずれかを設定します。

System.Windows.WindowStartupLocation 列挙体
[LocalizabilityAttribute(LocalizationCategory.None, Readability=Readability.Unreadable)]
public enum WindowStartupLocation

親ウィンドウの中央を表す CenterOwner、スクリーンの中央を表す CenterScreen、既定の座標を表す Manual のいずれかのメンバを指定することができます。既定では Manual が設定されています。

コード2
using System;
using System.Windows;

class Test {
	[STAThread]
	public static void Main() {
		Window wnd = new Window();
		wnd.WindowStartupLocation = WindowStartupLocation.CenterScreen;
		wnd.Width = 400;
		wnd.Height = 300;

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

コード2は、起動時に、ウィンドウの初期の座標が常にスクリーンの中央に配置されるように設定されています。プログラムを実行すると、表示されるウィンドウが、常に画面の中央に表示されることを確認できます。

2.3.5 最大化、最小化

ウィンドウの最大化ボタンや最小化ボタンを押し、ウィンドウを画面全体に最大化させたり、タスクバーなどにアイコン化して最小化することができます。この状態をプログラムから制御するには WindowState プロパティを利用します。

Window クラス WindowState プロパティ
public WindowState WindowState { get; set; }

WindowState プロパティには System.Windows.WindowState 列挙体のメンバを設定します。WindowState プロパティに WindowState 列挙体のメンバを設定して、ウィンドウの状態を変更したり、WindowState プロパティの現在の値を調べることで、ウィンドウが最大化状態かどうかなどを調べることができます。

System.Windows.WindowState 列挙体
public enum WindowState

WindowState 列挙体には、ウィンドウが最大化されていることを表す Maximized、最小化されていることを表す Minimized、そして、既定のサイズを表す Normal の 3 つのメンバが用意されています。

コード3
using System;
using System.Windows;

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

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

コード3は、WindowState プロパティに Maximized を設定している状態でウィンドウを表示しています。よって、このプログラムを実行すると、ウィンドウの座標やサイズに関係なく、最大化状態でウィンドウが表示されます。