次の方法で共有


WPF ウィンドウの概要

ユーザーは、Windows Presentation Foundation (WPF) アプリケーションと Windows を介してやり取りします。 ウィンドウの主な目的は、データを視覚化し、ユーザーがデータを操作できるようにするコンテンツをホストすることです。 WPF アプリケーションは、 Window クラスを使用して独自のウィンドウを提供します。 この記事では、アプリケーションでのウィンドウの作成と管理の基礎について説明する前に、 Window について説明します。

重要

この記事では、 C# プロジェクトから生成された XAML を使用します。 Visual Basic を使用している場合、XAML の外観が若干異なる場合があります。 これらの違いは、通常、 x:Class 属性値に存在します。 C# にはプロジェクトのルート名前空間が含まれていますが、Visual Basic には含まれません。

C# のプロジェクト テンプレートは、App ファイルに含まれる型を作成します。 Visual Basic では、型の名前は Application で、ファイルには Application.xaml という名前が付けられます。

Window クラス

WPF では、ウィンドウは、次の操作に使用する Window クラスによってカプセル化されます。

  • ウィンドウを表示します。
  • ウィンドウのサイズ、位置、外観を構成します。
  • アプリケーション固有のコンテンツをホストします。
  • ウィンドウの有効期間を管理します。

次の図は、ウィンドウの構成要素を示しています。

WPF ウィンドウの一部を示すスクリーンショット。

ウィンドウは、非クライアント領域とクライアント領域の 2 つの領域に分かれています。

ウィンドウの クライアント以外の領域 は WPF によって実装され、次のようなほとんどのウィンドウに共通するウィンドウの部分が含まれます。

  • タイトル バー (1 から 5)。
  • アイコン (1)。
  • タイトル (2)。
  • 最小化 (3)、最大化 (4)、閉じる (5) ボタン。
  • メニュー項目を含むシステム メニュー (6)。 アイコン (1) をクリックすると表示されます。
  • 罫線 (7)。

ウィンドウの クライアント領域 は、ウィンドウの非クライアント領域内の領域であり、開発者がメニュー バー、ツール バー、コントロールなどのアプリケーション固有のコンテンツを追加するために使用されます。

  • クライアント領域 (8)。
  • グリップのサイズを変更します (9)。 これは、クライアント領域 (8) に追加されたコントロールです。

ウィンドウの実装

一般的なウィンドウの実装には、外観と動作の両方が含まれます。 外観 は、ユーザーに対するウィンドウの外観を定義し、 動作 はユーザーがウィンドウを操作する場合のウィンドウの動作を定義します。 WPF では、コードまたは XAML マークアップを使用して、ウィンドウの外観と動作を実装できます。

ただし、一般に、ウィンドウの外観は XAML マークアップを使用して実装され、その動作は次の例に示すように分離コードを使用して実装されます。

<Window x:Class="WindowsOverview.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WindowsOverview"
        >

    <!-- Client area containing the content of the window -->

</Window>

次のコードは、XAML のコードビハインドです。

using System.Windows;

namespace WindowsOverview
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    }
}
Public Class Window1

End Class

XAML マークアップ ファイルと分離コード ファイルを連携させるには、次のものが必要です。

  • マークアップでは、 Window 要素に x:Class 属性を含める必要があります。 アプリケーションがビルドされると、x:Class属性が存在すると、Microsoft ビルド エンジン (MSBuild) によって、partial属性で指定された名前のWindowから派生するx:Class クラスが生成されます。 これには、XAML スキーマ (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml") の XML 名前空間宣言を追加する必要があります。 生成された partial クラスは、イベントを登録し、マークアップに実装されているプロパティを設定するために呼び出される InitializeComponent メソッドを実装します。

  • 分離コードでは、クラスは、マークアップのpartial属性で指定されたのと同じ名前のx:Class クラスである必要があり、Windowから派生する必要があります。 これにより、分離コード ファイルを、アプリケーションのビルド時にマークアップ ファイル用に生成される partial クラスに関連付けられます。詳細については、「 WPF アプリケーションのコンパイル」を参照してください。

  • 分離コードでは、 Window クラスは、 InitializeComponent メソッドを呼び出すコンストラクターを実装する必要があります。 InitializeComponent は、マークアップ ファイルの生成された partial クラスによって実装され、イベントを登録し、マークアップで定義されているプロパティを設定します。

Visual Studio を使用して新しい Window をプロジェクトに追加すると、 Window はマークアップと分離コードの両方を使用して実装され、ここで説明するようにマークアップファイルと分離コード ファイルの関連付けを作成するために必要な構成が含まれます。

この構成を設定すると、XAML マークアップでウィンドウの外観を定義し、その動作を分離コードに実装することに重点を置くことができます。 次の例は、 Click イベントのイベント ハンドラーを定義するボタンを含むウィンドウを示しています。 XAML でこれが実装され、コードビハインドでハンドラーが実装されます。

<Window x:Class="WindowsOverview.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WindowsOverview"
        >

    <!-- Client area containing the content of the window -->

    <Button Click="Button_Click">Click This Button</Button>

</Window>

次のコードは、XAML のコードビハインドです。

using System.Windows;

namespace WindowsOverview
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Button was clicked.");
        }
    }
}
Public Class Window1

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        MessageBox.Show("Button was clicked.")
    End Sub

End Class

MSBuild のウィンドウの構成

ウィンドウの実装方法によって、MSBuild の構成方法が決まります。 XAML マークアップと分離コードの両方を使用して定義されたウィンドウの場合:

  • XAML マークアップ ファイルは、MSBuild Page 項目として構成されます。
  • コードビハインド ファイルは、MSBuild Compile アイテムとして設定されています。

.NET SDK プロジェクトでは、適切な PageCompile 項目が自動的にインポートされるため、これらを宣言する必要はありません。 プロジェクトが WPF 用に構成されている場合、XAML マークアップ ファイルは Page 項目として自動的にインポートされ、対応する分離コード ファイルが Compileとしてインポートされます。

MSBuild プロジェクトでは、型は自動的にインポートされないため、自分で宣言する必要があります。

<Project>
    ...
    <Page Include="MarkupAndCodeBehindWindow.xaml" />
    <Compile Include=" MarkupAndCodeBehindWindow.xaml.cs" />
    ...
</Project>

WPF アプリケーションのビルドの詳細については、「 WPF アプリケーションのコンパイル」を参照してください。

ウィンドウの有効期間

他のクラスと同様に、ウィンドウの有効期間は、最初にインスタンス化されたときに開始され、その後は開き、アクティブ化または非アクティブ化され、最終的に閉じられます。

ウィンドウを開く

ウィンドウを開くには、まずそのインスタンスを作成します。次の例で示します。

using System.Windows;

namespace WindowsOverview
{
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            // Create the window
            Window1 window = new Window1();

            // Open the window
            window.Show();
        }
    }
}
Class Application

    Private Sub Application_Startup(sender As Object, e As StartupEventArgs)
        ' Create the window
        Dim window As New Window1

        ' Open the window
        window.Show()
    End Sub

End Class

この例では、 Window1 はアプリケーションの起動時にインスタンス化されます。これは、 Startup イベントが発生したときに発生します。 スタートアップ ウィンドウの詳細については、「 メイン アプリケーション ウィンドウを取得または設定する方法」を参照してください。

ウィンドウがインスタンス化されると、そのウィンドウへの参照が、 オブジェクトによって管理されるApplicationに自動的に追加されます。 インスタンス化する最初のウィンドウは、Applicationとしてによって自動的に設定されます。

次の図に示すように、 Show メソッドを呼び出してウィンドウが最後に開きます。

Showを呼び出して開いたウィンドウはモードレス ウィンドウであり、アプリケーションはユーザーがアプリケーション内の他のウィンドウと対話することを妨げることはありません。 ShowDialogでウィンドウを開くと、ウィンドウがモーダルとして開き、ユーザーの操作が特定のウィンドウに制限されます。 詳細については、「ダイアログ ボックスの概要」を参照してください。

Showが呼び出されると、ウィンドウは、ユーザー入力を受け取るインフラストラクチャを確立するために表示される前に初期化作業を行います。 ウィンドウが初期化されると、 SourceInitialized イベントが発生し、ウィンドウが表示されます。

詳細については、「 ウィンドウまたはダイアログ ボックスを開く方法」を参照してください。

[スタートアップ] ウィンドウ

前の例では、 Startup イベントを使用して、初期アプリケーション ウィンドウを表示するコードを実行しました。 ショートカットとして、代わりに StartupUri を使用して、アプリケーション内の XAML ファイルへのパスを指定します。 アプリケーションは、そのプロパティで指定されたウィンドウを自動的に作成して表示します。

<Application x:Class="WindowsOverview.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WindowsOverview"
             StartupUri="ClippedWindow.xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>

ウィンドウの所有権

Show メソッドを使用して開いたウィンドウには、それを作成したウィンドウとの暗黙的なリレーションシップがありません。 ユーザーは、いずれかのウィンドウを他のウィンドウとは別に操作できます。つまり、どちらのウィンドウでも次の操作を行うことができます。

  • 一方のウィンドウの Topmost プロパティが trueに設定されていない限り)、もう一方をカバーします。
  • 他に影響を与えずに最小化、最大化、および復元する。

一部のウィンドウでは、開く側のウィンドウとの関係が必要です。 たとえば、統合開発環境 (IDE) アプリケーションでは、プロパティ ウィンドウとツール ウィンドウを開き、そのウィンドウを作成するウィンドウをカバーするのが一般的な動作です。 さらに、このようなウィンドウは常に、作成元のウィンドウに連動して閉じ、最小化、最大化、復元する必要があります。 このような関係は、あるウィンドウを別のウィンドウにすることで確立でき、所有者ウィンドウへの参照を持つOwnerプロパティを設定することによって実現されます。 これを次の例に示します。

private void Button_Click(object sender, RoutedEventArgs e)
{
    // Create a window and make the current window its owner
    var ownedWindow = new ChildWindow1();
    ownedWindow.Owner = this;
    ownedWindow.Show();
}
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    ' Create a window and make the current window its owner
    Dim ownedWindow As New ChildWindow1
    ownedWindow.Owner = Me
    ownedWindow.Show()
End Sub

所有権が確立された後:

  • 所有されているウィンドウは、その Owner プロパティの値を調べることで、その所有者ウィンドウを参照できます。
  • 所有者ウィンドウは、 OwnedWindows プロパティの値を調べることで、所有しているすべてのウィンドウを検出できます。

ウィンドウのアクティブ化

ウィンドウが最初に開かれると、アクティブなウィンドウになります。 アクティブ ウィンドウは、キー ストロークやマウス クリックなど、現在ユーザー入力をキャプチャしているウィンドウです。 ウィンドウがアクティブになると、 Activated イベントが発生します。

ウィンドウが最初に開かれると、 Loaded イベントと ContentRendered イベントは、 Activated イベントが発生した後にのみ発生します。 これを念頭に置いて、 ContentRendered が発生したときにウィンドウを効果的に開いていると見なすことができます。

ウィンドウがアクティブになると、ユーザーは同じアプリケーション内の別のウィンドウをアクティブ化したり、別のアプリケーションをアクティブ化したりできます。 その場合、現在アクティブなウィンドウが非アクティブになり、 Deactivated イベントが発生します。 同様に、ユーザーが現在非アクティブなウィンドウを選択すると、ウィンドウが再度アクティブになり、 Activated が発生します。

ActivatedDeactivatedを処理する一般的な理由の 1 つは、ウィンドウがアクティブなときにのみ実行できる機能を有効または無効にすることです。 たとえば、一部のウィンドウには、ゲームやビデオ プレーヤーなど、一定のユーザー入力や注意が必要な対話型コンテンツが表示されます。 次の例は、この動作を実装するために ActivatedDeactivated を処理する方法を示す簡略化されたビデオ プレーヤーです。

<Window x:Class="WindowsOverview.CustomMediaPlayerWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Activated="Window_Activated"
        Deactivated="Window_Deactivated"
        Title="CustomMediaPlayerWindow" Height="450" Width="800">
    <Grid>
        <MediaElement x:Name="mediaElement" Stretch="Fill"
                      LoadedBehavior="Manual" Source="numbers.mp4" />
    </Grid>
</Window>

次のコードは、XAML のコードビハインドです。

using System;
using System.Windows;

namespace WindowsOverview
{
    public partial class CustomMediaPlayerWindow : Window
    {
        public CustomMediaPlayerWindow() =>
            InitializeComponent();

        private void Window_Activated(object sender, EventArgs e)
        {
            // Continue playing media if window is activated
            mediaElement.Play();
        }

        private void Window_Deactivated(object sender, EventArgs e)
        {
            // Pause playing if media is being played and window is deactivated
            mediaElement.Pause();
        }
    }
}
Public Class CustomMediaPlayerWindow
    Private Sub Window_Activated(sender As Object, e As EventArgs)
        ' Continue playing media if window Is activated
        mediaElement.Play()
    End Sub

    Private Sub Window_Deactivated(sender As Object, e As EventArgs)
        ' Pause playing if media is being played and window is deactivated
        mediaElement.Pause()
    End Sub
End Class

他の種類のアプリケーションでも、ウィンドウが非アクティブ化されたときにバックグラウンドでコードが実行される場合があります。 たとえば、メール クライアントは、ユーザーが他のアプリケーションを使用している間、メール サーバーのポーリングを続行できます。 多くの場合、このようなアプリケーションでは、メイン ウィンドウが非アクティブ化されている間に、異なる動作や追加の動作が提供されます。 メール プログラムの場合、これは、受信トレイに新しいメール アイテムを追加し、システム トレイに通知アイコンを追加することを意味する場合があります。 通知アイコンは、メール ウィンドウがアクティブでない場合にのみ表示する必要があります。これは、 IsActive プロパティを調べることで決定されます。

バックグラウンド タスクが完了した場合、ウィンドウでは、 Activate メソッドを呼び出すことによって、ユーザーに緊急の通知を行う必要がある場合があります。 Activateが呼び出されたときにアクティブ化された別のアプリケーションをユーザーが操作している場合は、ウィンドウのタスク バー ボタンが点滅します。 ただし、ユーザーが現在のアプリケーションと対話している場合、 Activate を呼び出すとウィンドウがフォアグラウンドになります。

Application.ActivatedイベントとApplication.Deactivated イベントを使用して、アプリケーション スコープのアクティブ化を処理できます。

ウィンドウのアクティブ化の防止

チャット アプリケーションの会話ウィンドウや電子メール アプリケーションの通知ウィンドウなど、ウィンドウを表示するときにアクティブ化しないシナリオがあります。

表示されたときにアクティブ化すべきではないウィンドウがアプリケーションにある場合は、ShowActivated メソッドを初めて呼び出す前に、そのfalse プロパティをShowに設定できます。 その結果、次のようになります。

  • ウィンドウはアクティブ化されていません。
  • ウィンドウの Activated イベントは発生しません。
  • 現在アクティブ化されているウィンドウはアクティブなままです。

ただし、ウィンドウは、ユーザーがクライアント領域またはクライアント以外の領域をクリックしてアクティブ化するとすぐにアクティブになります。 この場合、次のようになります。

  • ウィンドウがアクティブになります。
  • ウィンドウの Activated イベントが発生します。
  • 以前にアクティブ化されたウィンドウは非アクティブ化されます。
  • ウィンドウの Deactivated イベントと Activated イベントは、ユーザーの操作に応じて期待どおりに発生します。

ウィンドウを閉じる

ユーザーがウィンドウを閉じると、ウィンドウの有効期間が終了し始めます。 ウィンドウを閉じると、ウィンドウを再度開くできなくなります。 ウィンドウは、次のようなクライアント以外の領域の要素を使用して閉じることができます。

  • [システム] メニューの [閉じる] 項目。
  • Alt + F4 キーを押します。
  • [閉じる] ボタンを押します。
  • ボタンに プロパティがモーダル ウィンドウでIsCancelに設定されている場合はtrueを押します。

ウィンドウを閉じるには、より多くのメカニズムをクライアント領域に提供できます。その一般的な例を次に示します。

  • [ファイル] メニューの [終了] 項目 (通常はメイン アプリケーション ウィンドウ用)。
  • [ファイル] メニューの [閉じる] 項目 (通常はセカンダリ アプリケーション ウィンドウ)。
  • 通常、モーダル ダイアログ ボックスの [キャンセル ] ボタン。
  • モードレス ダイアログ ボックスで通常使用される[閉じる]ボタン。

これらのカスタム メカニズムのいずれかに応答してウィンドウを閉じるには、 Close メソッドを呼び出す必要があります。 次の例では、[ファイル] メニューから [終了] を選択してウィンドウを閉じる機能を実装します。

<Window x:Class="WindowsOverview.ClosingWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ClosingWindow" Height="450" Width="800">
    <StackPanel>
        <Menu>
            <MenuItem Header="_File">
                <MenuItem Header="E_xit" Click="fileExitMenuItem_Click" />
            </MenuItem>
        </Menu>
    </StackPanel>
</Window>

次のコードは、XAML のコードビハインドです。

using System.Windows;

namespace WindowsOverview
{
    public partial class ClosingWindow : Window
    {
        public ClosingWindow() =>
            InitializeComponent();

        private void fileExitMenuItem_Click(object sender, RoutedEventArgs e)
        {
            // Close the current window
            this.Close();
        }
    }
}
Public Class ClosingWindow
    Private Sub fileExitMenuItem_Click(sender As Object, e As RoutedEventArgs)
        ' Close the current window
        Me.Close()
    End Sub
End Class

メイン アプリケーション ウィンドウが閉じる ( MainWindowを参照) か、最後のウィンドウが閉じたときに、アプリケーションを自動的にシャットダウンするように構成できます。 詳細については、ShutdownModeを参照してください。

ウィンドウは、クライアント以外の領域とクライアント領域で提供されるメカニズムを使用して明示的に閉じることができますが、次のようなアプリケーションまたは Windows の他の部分での動作の結果として、ウィンドウを暗黙的に閉じることもできます。

  • ユーザーが Windows をログオフまたはシャットダウンします。
  • ウィンドウの Owner が閉じます。
  • メイン アプリケーション ウィンドウが閉じられ、 ShutdownModeOnMainWindowClose
  • Shutdown が呼び出されます

重要

ウィンドウを閉じた後は、ウィンドウを再度開くできません。

ウィンドウの終了を取り消す

ウィンドウが閉じると、 ClosingClosedの 2 つのイベントが発生します。

Closing はウィンドウが閉じる前に発生し、ウィンドウが閉じるのを防ぐメカニズムを提供します。 ウィンドウが閉じないようにする一般的な理由の 1 つは、ウィンドウコンテンツに変更されたデータが含まれている場合です。 このような状況では、 Closing イベントを処理して、データがダーティかどうかを判断し、その場合は、データを保存せずにウィンドウを閉じ続けるか、ウィンドウの終了を取り消すかをユーザーに尋ねることができます。 次の例は、 Closingを処理する主な側面を示しています。

<Window x:Class="WindowsOverview.DataWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataWindow" Height="450" Width="800"
        Closing="Window_Closing">
    <Grid>
        <TextBox x:Name="documentTextBox" TextChanged="documentTextBox_TextChanged" />
    </Grid>
</Window>

次のコードは、XAML のコードビハインドです。

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

namespace WindowsOverview
{
    public partial class DataWindow : Window
    {
        private bool _isDataDirty;

        public DataWindow() =>
            InitializeComponent();

        private void documentTextBox_TextChanged(object sender, TextChangedEventArgs e) =>
            _isDataDirty = true;

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // If data is dirty, prompt user and ask for a response
            if (_isDataDirty)
            {
                var result = MessageBox.Show("Document has changed. Close without saving?",
                                             "Question",
                                             MessageBoxButton.YesNo);

                // User doesn't want to close, cancel closure
                if (result == MessageBoxResult.No)
                    e.Cancel = true;
            }
        }
    }
}
Public Class DataWindow

    Private _isDataDirty As Boolean

    Private Sub documentTextBox_TextChanged(sender As Object, e As TextChangedEventArgs)
        _isDataDirty = True
    End Sub

    Private Sub Window_Closing(sender As Object, e As ComponentModel.CancelEventArgs)

        ' If data is dirty, prompt user and ask for a response
        If _isDataDirty Then
            Dim result = MessageBox.Show("Document has changed. Close without saving?",
                                         "Question",
                                         MessageBoxButton.YesNo)

            ' User doesn't want to close, cancel closure
            If result = MessageBoxResult.No Then
                e.Cancel = True
            End If
        End If

    End Sub
End Class

Closing イベント ハンドラーには、ウィンドウが閉じないようにCancelEventArgsに設定したCancel プロパティを実装するtrueが渡されます。

Closingが処理されていない場合、または処理されたが取り消されていない場合、ウィンドウは閉じます。 ウィンドウが実際に閉じる直前に、 Closed が発生します。 この時点で、ウィンドウを閉じることはできません。

ウィンドウの有効期間イベント

次の図は、ウィンドウの有効期間中のプリンシパル イベントのシーケンスを示しています。

ウィンドウの有効期間内のイベントを示す図。

次の図は、アクティブ化なしで表示されるウィンドウの有効期間中のプリンシパル イベントのシーケンスを示しています (ShowActivated は、ウィンドウが表示される前に false に設定されています)。

アクティブ化なしでウィンドウの有効期間内のイベントを示す図。

ウィンドウの場所

ウィンドウが開いている間は、デスクトップを基準にした x および y の寸法の位置が表示されます。 この場所は、 Left プロパティと Top プロパティをそれぞれ調べることで決定できます。 これらのプロパティを設定して、ウィンドウの場所を変更します。

次のいずれかのWindow列挙値を使用して WindowStartupLocation プロパティを設定することで、WindowStartupLocationの最初の位置を指定することもできます。

スタートアップの場所が Manualとして指定されていて、 Left プロパティと Top プロパティが設定されていない場合、 Window はオペレーティング システムに表示される場所を要求します。

一番上のウィンドウと z オーダー

x と y の位置に加えて、ウィンドウには z ディメンション内の位置があり、他のウィンドウに対する垂直方向の位置が決まります。 これはウィンドウの z オーダーと呼ばれ、 通常 の z オーダーと 最上位 の z オーダーの 2 種類があります。 通常の z オーダーのウィンドウの位置は、ウィンドウが現在アクティブかどうかによって決まります。 既定では、ウィンドウは通常の z オーダーに配置されます。 一番上の z オーダーのウィンドウの位置は、現在アクティブかどうかによっても決まります。 さらに、一番上の z オーダーのウィンドウは、常に通常の z オーダーでウィンドウの上に配置されます。 ウィンドウは、 Topmost プロパティを true に設定することで、一番上の z オーダーに配置されます。

z オーダーの種類ごとに、現在アクティブなウィンドウが他のすべてのウィンドウの上に同じ z オーダーで表示されます。

ウィンドウ サイズ

デスクトップの場所に加えて、ウィンドウには、さまざまな幅と高さのプロパティや SizeToContentなど、いくつかのプロパティによって決定されるサイズがあります。

MinWidthWidth、および MaxWidth は、ウィンドウの有効期間中に使用できる幅の範囲を管理するために使用されます。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    MinWidth="300" Width="400" MaxWidth="500">
</Window>

ウィンドウの高さは、 MinHeightHeight、および MaxHeightによって管理されます。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    MinHeight="300" Height="400" MaxHeight="500">
</Window>

さまざまな幅の値と高さの値はそれぞれ範囲を指定するため、サイズ変更可能なウィンドウの幅と高さは、それぞれのディメンションの指定された範囲内の任意の場所に配置できます。 現在の幅と高さを検出するには、それぞれ ActualWidthActualHeightを調べます。

ウィンドウの幅と高さをウィンドウのコンテンツのサイズに合わせたサイズにする場合は、次の値を持つ SizeToContent プロパティを使用できます。

次の例は、最初に表示されたときに、コンテンツに合わせて垂直方向と水平方向の両方に合わせて自動的にサイズを設定するウィンドウを示しています。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    SizeToContent="WidthAndHeight">
</Window>

次の例では、コードで SizeToContent プロパティを設定して、ウィンドウのサイズをコンテンツに合わせて変更する方法を指定する方法を示します。

// Manually alter window height and width
this.SizeToContent = SizeToContent.Manual;

// Automatically resize width relative to content
this.SizeToContent = SizeToContent.Width;

// Automatically resize height relative to content
this.SizeToContent = SizeToContent.Height;

// Automatically resize height and width relative to content
this.SizeToContent = SizeToContent.WidthAndHeight;
' Manually alter window height and width
Me.SizeToContent = SizeToContent.Manual

' Automatically resize width relative to content
Me.SizeToContent = SizeToContent.Width

' Automatically resize height relative to content
Me.SizeToContent = SizeToContent.Height

' Automatically resize height and width relative to content
Me.SizeToContent = SizeToContent.WidthAndHeight

サイズプロパティの優先順位

基本的に、ウィンドウのさまざまなサイズプロパティを組み合わせて、サイズ変更可能なウィンドウの幅と高さの範囲を定義します。 有効な範囲を維持するために、 Window は、次の優先順位を使用してサイズ プロパティの値を評価します。

高さプロパティの場合:

  1. FrameworkElement.MinHeight
  2. FrameworkElement.MaxHeight
  3. SizeToContent.Height / SizeToContent.WidthAndHeight
  4. FrameworkElement.Height

Width プロパティの場合:

  1. FrameworkElement.MinWidth
  2. FrameworkElement.MaxWidth
  3. SizeToContent.Width / SizeToContent.WidthAndHeight
  4. FrameworkElement.Width

優先順位は、ウィンドウが最大化されたときにウィンドウのサイズを決定することもできます。ウィンドウは、 WindowState プロパティで管理されます。

ウィンドウの状態

サイズ変更可能ウィンドウの有効期間中は、標準、最小化、最大化の 3 つの状態を持つことができます。 通常の状態のウィンドウは、ウィンドウの既定の状態です。 この状態のウィンドウでは、サイズ変更可能な場合は、サイズ変更グリップまたは境界線を使用して移動およびサイズ変更できます。

最小化 された 状態のウィンドウは、 ShowInTaskbartrue に設定されている場合はタスク バー ボタンに折りたたまれます。それ以外の場合は、可能な限り小さいサイズに折りたたまれて、デスクトップの左下隅に移動します。 タスク バーに表示されない最小化されたウィンドウはデスクトップの周りをドラッグできますが、最小化されたウィンドウのどちらの種類も、境界線またはサイズ変更グリップを使用してサイズを変更することはできません。

最大化された状態のウィンドウは、MaxWidth、およびMaxHeightプロパティによって決定される最大のサイズまで拡大されます。 最小化されたウィンドウと同様に、最大化されたウィンドウはサイズを変更することができません。サイズ変更グリップを使用したり、境界線をドラッグしてもできません。

ウィンドウの TopLeftWidth、および Height のプロパティの値は、ウィンドウが現在最大化または最小化されている場合でも、常に通常の状態の値を表します。

ウィンドウの状態は、 WindowState プロパティを設定することで構成できます。このプロパティには、次の WindowState 列挙値のいずれかを指定できます。

次の例は、ウィンドウが開いたときに最大化されたウィンドウを作成する方法を示しています。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    WindowState="Maximized">
</Window>

一般に、ウィンドウの初期状態を構成する WindowState を設定する必要があります。 サイズ変更可能なウィンドウが表示されたら、ユーザーはウィンドウのタイトル バーの最小化、最大化、および復元ボタンを押して、ウィンドウの状態を変更できます。

ウィンドウの外観

ウィンドウのクライアント領域の外観を変更するには、ウィンドウ固有のコンテンツ (ボタン、ラベル、テキスト ボックスなど) を追加します。 クライアント以外の領域を構成するために、 Window には、ウィンドウのアイコンを設定する Icon や、タイトルを設定するための Title など、いくつかのプロパティが用意されています。

また、ウィンドウのサイズ変更モード、ウィンドウ スタイル、デスクトップ タスク バーにボタンとして表示されるかどうかを構成することで、クライアント領域以外の境界線の外観と動作を変更することもできます。

サイズ変更モード

WindowStyleプロパティに応じて、ユーザーがウィンドウのサイズを変更するかどうかを制御できます。 ウィンドウ スタイルは、次の内容に影響します。

  • ウィンドウの境界線をマウスでドラッグして、サイズ変更を許可または禁止します。
  • [ 最小化]、[ 最大化]、[ 閉じる] ボタンがクライアント以外の領域に表示されるかどうか。
  • [最小化]、[最大化]、[閉じる] ボタンが有効かどうか。

ウィンドウのサイズを変更する方法を構成するには、 ResizeMode プロパティを設定します。これは、次の ResizeMode 列挙値のいずれかになります。

WindowStyleと同様に、ウィンドウのサイズ変更モードが有効期間中に変更される可能性は低く、XAML マークアップから設定する可能性が最も高いことを意味します。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ResizeMode="CanResizeWithGrip">
</Window>

ウィンドウが最大化、最小化、または復元されるかどうかを検出するには、 WindowState プロパティを調べることで注意してください。

ウィンドウ スタイル

ウィンドウのクライアント以外の領域から公開される境界線は、ほとんどのアプリケーションに適しています。 ただし、ウィンドウの種類によっては、異なる種類の罫線が必要な場合や、罫線がまったく必要ない状況があります。

ウィンドウが取得する境界線の種類を制御するには、WindowStyle列挙体の次のいずれかの値を使用して、WindowStyle プロパティを設定します。

ウィンドウ スタイルを適用した場合の効果を次の図に示します。

WINDOWStyle が WPF のウィンドウに与える影響を示すスクリーンショット。

上の図では、 SingleBorderWindowThreeDBorderWindowの間に顕著な違いはありません。 Windows XP に戻ると、 ThreeDBorderWindow はウィンドウの描画方法に影響を与え、クライアント領域に 3D 罫線を追加しました。 Windows 7 以降では、2 つのスタイルの違いは最小限です。

XAML マークアップまたはコードを使用して WindowStyle を設定できます。 ウィンドウの有効期間中に変更される可能性は低いため、ほとんどの場合、XAML マークアップを使用して構成します。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    WindowStyle="ToolWindow">
</Window>

四角形以外のウィンドウ スタイル

また、WindowStyle から提供される罫線スタイルが十分でない場合もあります。 たとえば、Microsoft Windows Media Player で使用されているような、四角形以外の境界線を持つアプリケーションを作成できます。

たとえば、以下の画像に示された吹き出しウィンドウを考えてみてください。

クリップされた領域とカスタム図形を含む WPF ウィンドウのスクリーンショット。

この種類のウィンドウを作成するには、WindowStyle プロパティを None に設定し、Window の持つ透明性をサポートする特別な機能を利用します。

<Window x:Class="WindowsOverview.ClippedWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ClippedWindow" SizeToContent="WidthAndHeight"
        WindowStyle="None" AllowsTransparency="True" Background="Transparent">
    <Grid Margin="20">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="20"/>
        </Grid.RowDefinitions>

        <Rectangle Stroke="#FF000000" RadiusX="10" RadiusY="10"/>
        <Path Fill="White" Stretch="Fill" Stroke="#FF000000" HorizontalAlignment="Left" Margin="15,-5.597,0,-0.003" Width="30" Grid.Row="1" Data="M22.166642,154.45381 L29.999666,187.66699 40.791059,154.54395"/>
        <Rectangle Fill="White" RadiusX="10" RadiusY="10" Margin="1"/>
        
        <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="25" Text="Greetings!" TextWrapping="Wrap" Margin="5,5,50,5"/>
        <Button HorizontalAlignment="Right" VerticalAlignment="Top" Background="Transparent" BorderBrush="{x:Null}" Foreground="Red" Content="❌" FontSize="15" />

        <Grid.Effect>
            <DropShadowEffect BlurRadius="10" ShadowDepth="3" Color="LightBlue"/>
        </Grid.Effect>
    </Grid>
</Window>

この値の組み合わせは、ウィンドウに透明なレンダリングを指示します。 この状態では、ウィンドウのクライアント領域以外の装飾ボタンを使用できないため、独自のボタンを指定する必要があります。

タスクバーの存在

ウィンドウの既定の外観には、タスク バー ボタンが含まれています。 一部の種類のウィンドウには、メッセージ ボックス、 ダイアログ ボックス、 WindowStyle プロパティが ToolWindow に設定されたウィンドウなど、タスク バー ボタンがありません。 ウィンドウのタスク バー ボタンを表示するかどうかを制御するには、既定でShowInTaskbartrueプロパティを設定します。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    ShowInTaskbar="False">
</Window>

その他の種類のウィンドウ

NavigationWindow は、ナビゲーション可能なコンテンツをホストするように設計されたウィンドウです。

ダイアログ ボックスは、関数を完了するためにユーザーから情報を収集するためによく使用されるウィンドウです。 たとえば、ユーザーがファイルを開く場合、アプリケーションによって [ ファイルを開く ] ダイアログ ボックスが表示され、ユーザーからファイル名が取得されます。 詳細については、「ダイアログ ボックスの概要」を参照してください。

こちらも参照ください