アプリケーション管理の概要Application Management Overview

すべてのアプリケーションは、アプリケーションの実装と管理に適用される機能を共有することがよくあります。All applications tend to share a common set of functionality that applies to application implementation and management. このトピックでは、機能の概要、Applicationクラスを作成すると、アプリケーションを管理します。This topic provides an overview of the functionality in the Application class for creating and managing applications.

Application クラスThe Application Class

WPF では、一般的なアプリケーション スコープの機能がカプセル化された、Applicationクラス。In WPF, common application-scoped functionality is encapsulated in the Application class. Applicationクラスには、次の機能が含まれています。The Application class includes the following functionality:

  • アプリケーションの有効期間を追跡し、相互作用する。Tracking and interacting with application lifetime.

  • コマンド ライン パラメーターを取得し、処理する。Retrieving and processing command-line parameters.

  • 未処理の例外を検出し、応答する。Detecting and responding to unhandled exceptions.

  • アプリケーション スコープのプロパティと リソースを共有する。Sharing application-scope properties and resources.

  • スタンドアロン アプリケーションのウィンドウを管理する。Managing windows in standalone applications.

  • ナビゲーションを追跡し、管理する。Tracking and managing navigation.

アプリケーションのクラスを使用して一般的なタスクを実行する方法How to Perform Common Tasks Using the Application Class

すべての詳細の興味のあるないかどうか、Applicationクラス、次の表に、いくつかの一般的なタスクの一覧Applicationとそれを実現する方法。If you are not interested in all of the details of the Application class, the following table lists some of the common tasks for Application and how to accomplish them. 関連する API とトピックを表示することによって、詳細情報とサンプル コードを参照できます。By viewing the related API and topics, you can find more information and sample code.

タスクTask 方法Approach
現在のアプリケーションを表すオブジェクトを取得するGet an object that represents the current application Application.Current プロパティを使用します。Use the Application.Current property.
起動画面をアプリケーションに追加するAdd a startup screen to an application 参照してくださいスプラッシュ スクリーンを WPF アプリケーションに追加します。See Add a Splash Screen to a WPF Application.
アプリケーションを起動するStart an application Application.Run メソッドを使用します。Use the Application.Run method.
アプリケーションを停止するStop an application 使用して、Shutdownのメソッド、Application.Currentオブジェクト。Use the Shutdown method of the Application.Current object.
コマンド ラインから引数を取得するGet arguments from the command line 処理、Application.Startupイベントと使用、StartupEventArgs.Argsプロパティ。Handle the Application.Startup event and use the StartupEventArgs.Args property. 例については、次を参照してください。、Application.Startupイベント。For an example, see the Application.Startup event.
アプリケーションの終了コードを取得し、設定するGet and set the application exit code 設定、ExitEventArgs.ApplicationExitCodeプロパティ、Application.Exitイベント ハンドラーまたは呼び出し、Shutdownメソッドと整数を渡します。Set the ExitEventArgs.ApplicationExitCode property in the Application.Exit event handler or call the Shutdown method and pass in an integer.
未処理の例外を検出し、応答するDetect and respond to unhandled exceptions 処理、DispatcherUnhandledExceptionイベント。Handle the DispatcherUnhandledException event.
アプリケーション スコープのリソースを取得し、設定するGet and set application-scoped resources Application.Resources プロパティを使用します。Use the Application.Resources property.
アプリケーション スコープのリソース ディクショナリを使用するUse an application-scope resource dictionary 参照してくださいアプリケーション スコープのリソース ディクショナリを使用するします。See Use an Application-Scope Resource Dictionary.
アプリケーション スコープのプロパティを取得し、設定するGet and set application-scoped properties Application.Properties プロパティを使用します。Use the Application.Properties property.
アプリケーションの状態を取得し、保存するGet and save an application's state 参照してください永続化およびアプリケーション セッション全体でアプリケーション スコープのプロパティを復元します。See Persist and Restore Application-Scope Properties Across Application Sessions.
リソース ファイル、コンテンツ ファイル、起点ファイルなど、コード以外のデータ ファイルを管理する。Manage non-code data files, including resource files, content files, and site-of-origin files. 参照してくださいWPF アプリケーションのリソース、コンテンツ、およびデータ ファイルします。See WPF Application Resource, Content, and Data Files.
スタンドアロン アプリケーションのウィンドウを管理するManage windows in standalone applications WPF ウィンドウの概要」を参照してください。See WPF Windows Overview.
ナビゲーションを追跡し、管理するTrack and manage navigation 参照してくださいナビゲーションの概要します。See Navigation Overview.

アプリケーション定義The Application Definition

機能を利用する、Applicationクラス、アプリケーション定義を実装する必要があります。To utilize the functionality of the Application class, you must implement an application definition. WPF アプリケーションの定義から派生したクラスは、Applicationが特殊な MSBuild 設定で構成されているとします。A WPF application definition is a class that derives from Application and is configured with a special MSBuild setting.

アプリケーション定義の実装Implementing an Application Definition

一般的な WPF アプリケーションの定義は、マークアップと分離コードの両方を使用して実装されます。A typical WPF application definition is implemented using both markup and code-behind. これにより、マークアップを使用して、アプリケーションのプロパティやリソースを宣言によって設定したり、イベントを登録したりでき、分離コードでイベントを処理し、アプリケーション固有の動作を実装することができます。This allows you to use markup to declaratively set application properties, resources, and register events, while handling events and implementing application-specific behavior in code-behind.

次の例では、マークアップと分離コードの両方を使用してアプリケーション定義を実装する方法を示します。The following example shows how to implement an application definition using both markup and code-behind:

<Application 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  x:Class="SDKSample.App" />
using System.Windows;

namespace SDKSample
{
    public partial class App : Application { }
}

Imports Microsoft.VisualBasic
Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
    End Class
End Namespace

マークアップ ファイルと分離コード ファイルを連携させるには、次のようにする必要があります。To allow a markup file and code-behind file to work together, the following needs to happen:

  • マークアップでは、Application要素を含める必要があります、x:Class属性。In markup, the Application element must include the x:Class attribute. ときに、アプリケーションがビルドが存在するx:Classを作成するために MSBuild を原因と、マークアップ ファイルをpartialクラスから派生したApplicationによって指定された名前を持つ、x:Class属性。When the application is built, the existence of x:Class in the markup file causes MSBuild to create a partial class that derives from Application and has the name that is specified by the x:Class attribute. XAML スキーマの XML 名前空間宣言を追加する必要があります (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml")。This requires the addition of an XML namespace declaration for the XAML schema (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml").

  • 分離コード クラスがある必要があります、partialによって指定される同じ名前のクラス、x:Classマークアップ属性およびから派生する必要がありますApplicationします。In code-behind, the class must be a partial class with the same name that is specified by the x:Class attribute in markup and must derive from Application. これにより、分離コード ファイルに関連付けられる、partialアプリケーションのビルド時にマークアップ ファイル用に生成されたクラス (を参照してくださいWPF アプリケーションのビルド)。This allows the code-behind file to be associated with the partial class that is generated for the markup file when the application is built (see Building a WPF Application).

注意

新しい WPF アプリケーション プロジェクトまたは Visual Studio を使用して WPF ブラウザー アプリケーション プロジェクトを作成するときに、アプリケーション定義は既定で含まれているし、マークアップと分離コードの両方を使用して定義されます。When you create a new WPF Application project or WPF Browser Application project using Visual Studio, an application definition is included by default and is defined using both markup and code-behind.

このコードは、アプリケーション定義を実装するために最低限必要です。This code is the minimum that is required to implement an application definition. ただし、追加の MSBuild の構成を構築してアプリケーションを実行する前にアプリケーション定義にする必要があります。However, an additional MSBuild configuration needs to be made to the application definition before building and running the application.

MSBuild 用のアプリケーション定義の構成Configuring the Application Definition for MSBuild

スタンドアロン アプリケーションと XAML ブラウザー アプリケーション (Xbap) に実行する前に、一定レベルのインフラストラクチャの実装が必要です。Standalone applications and XAML browser applications (XBAPs) require the implementation of a certain level of infrastructure before they can run. このインフラストラクチャの最も重要な部分は、エントリ ポイントです。The most important part of this infrastructure is the entry point. ユーザーがアプリケーションを起動するとき、オペレーティング システムはエントリ ポイントを呼び出します。これは、アプリケーションを起動するための、よく知られている機能です。When an application is launched by a user, the operating system calls the entry point, which is a well-known function for starting applications.

従来、開発者は、テクノロジに応じて、このコードの一部または全部を自分で記述する必要がありました。Traditionally, developers have needed to write some or all of this code for themselves, depending on the technology. ただし、WPF このコードを生成する MSBuild として、アプリケーション定義のマークアップ ファイルが構成されているApplicationDefinition項目を次の MSBuild プロジェクト ファイルに示すようにします。However, WPF generates this code for you when the markup file of your application definition is configured as an MSBuild ApplicationDefinition item, as shown in the following MSBuild project file:

<Project   
  DefaultTargets="Build"  
                        xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
  ...  
  <ApplicationDefinition Include="App.xaml" />  
  <Compile Include="App.xaml.cs" />  
  ...  
</Project>  

MSBuild とマークされている分離コード ファイルには、コードが含まれている、ためCompile項目、通常は。Because the code-behind file contains code, it is marked as an MSBuild Compile item, as is normal.

アプリケーション定義のマークアップと分離コード ファイルにこれらの MSBuild 構成のアプリケーションでは、次のようなコードを生成する MSBuild が発生します。The application of these MSBuild configurations to the markup and code-behind files of an application definition causes MSBuild to generate code like the following:

using System;
using System.Windows;

namespace SDKSample
{
    public class App : Application
    {
        public App() { }
        [STAThread]
        public static void Main()
        {
            // Create new instance of application subclass
            App app = new App();

            // Code to register events and set properties that were
            // defined in XAML in the application definition
            app.InitializeComponent();

            // Start running the application
            app.Run();
        }

        public void InitializeComponent()
        {
            // Initialization code goes here.
        }
    }
}
Imports System.Windows

Namespace SDKSample
    Public Class App
        Inherits Application
        Public Sub New()
        End Sub
        <STAThread>
        Public Shared Sub Main()
            ' Create new instance of application subclass
            Dim app As New App()

            ' Code to register events and set properties that were
            ' defined in XAML in the application definition
            app.InitializeComponent()

            ' Start running the application
            app.Run()
        End Sub

        Public Sub InitializeComponent()
            ' Initialization code goes here.	
        End Sub
    End Class
End Namespace

結果のコードは、アプリケーション定義に追加のインフラストラクチャのコードは、エントリ ポイント メソッドが含まれるMainします。The resulting code augments your application definition with additional infrastructure code, which includes the entry-point method Main. STAThreadAttribute属性に適用されます、Mainメソッドの WPF アプリケーションのメイン UI スレッドが STA スレッドでは WPF アプリケーションに必要であることを示します。The STAThreadAttribute attribute is applied to the Main method to indicate that the main UI thread for the WPF application is an STA thread, which is required for WPF applications. 呼び出されると、Mainの新しいインスタンスを作成します。App呼び出す前に、InitializeComponentマークアップでイベントが登録され、プロパティを設定するメソッドを実装します。When called, Main creates a new instance of App before calling the InitializeComponent method to register the events and set the properties that are implemented in markup. InitializeComponentが生成される、明示的に呼び出す必要はありませんInitializeComponentと同じように、アプリケーション定義からPageWindow実装します。Because InitializeComponent is generated for you, you don't need to explicitly call InitializeComponent from an application definition like you do for Page and Window implementations. 最後に、Runメソッドが呼び出され、アプリケーションを起動します。Finally, the Run method is called to start the application.

現在のアプリケーションの取得Getting the Current Application

の機能、Applicationクラスは、アプリケーション全体で共有されているのインスタンスは 1 つだけ指定できます、ApplicationあたりクラスAppDomainします。Because the functionality of the Application class are shared across an application, there can be only one instance of the Application class per AppDomain. これを強制する、Applicationクラスがシングルトン クラスとして実装されます (を参照してくださいImplementing Singleton in c#)、自体の 1 つのインスタンスを作成し、提供する共有アクセスを使って、 static Currentプロパティ。To enforce this, the Application class is implemented as a singleton class (see Implementing Singleton in C#), which creates a single instance of itself and provides shared access to it with the staticCurrent property.

次のコードへの参照を取得する方法を示しています、 Application 、現在のオブジェクトAppDomainします。The following code shows how to acquire a reference to the Application object for the current AppDomain.

// Get current application
Application current = App.Current;
' Get current application
Dim current As Application = App.Current

Current インスタンスへの参照を返します、Applicationクラス。Current returns a reference to an instance of the Application class. 参照の場合、Application派生クラスの値をキャストする必要があります、Currentプロパティは、次の例に示すようにします。If you want a reference to your Application derived class you must cast the value of the Current property, as shown in the following example.

// Get strongly-typed current application
App app = (App)App.Current;
' Get strongly-typed current application
Dim appCurrent As App = CType(App.Current, App)

値を検査するCurrentの有効期間のどの時点でも、Applicationオブジェクト。You can inspect the value of Current at any point in the lifetime of an Application object. ただし、注意が必要です。However, you should be careful. 後に、Applicationクラスがインスタンス化は、この期間の状態、Applicationオブジェクトに整合性がありません。After the Application class is instantiated, there is a period during which the state of the Application object is inconsistent. この期間中、Applicationアプリケーション インフラストラクチャを確立、プロパティの設定、およびイベントの登録など、コードを実行するために必要なさまざまな初期化タスクを実行するがします。During this period, Application is performing the various initialization tasks that are required by your code to run, including establishing application infrastructure, setting properties, and registering events. 使用しようとする場合、 Application 、コードがあります。 この期間中、オブジェクトの予期しない結果をさまざまな依存している場合に特にApplicationプロパティを設定します。If you try to use the Application object during this period, your code may have unexpected results, particularly if it depends on the various Application properties being set.

ときにApplicationが初期化操作が完了するとその有効期間が実際に開始します。When Application completes its initialization work, its lifetime truly begins.

アプリケーションの有効期間Application Lifetime

WPF アプリケーションの有効期間がによって発生するいくつかのイベントによってマークされているApplicationアプリケーションが開始したことを知らせるがアクティブ化され、非アクティブ化し、シャット ダウンされています。The lifetime of a WPF application is marked by several events that are raised by Application to let you know when your application has started, has been activated and deactivated, and has been shut down.

スプラッシュ スクリーンSplash Screen

以降では、 .NET Framework 3.5 SP1.NET Framework 3.5 SP1、スタートアップ ウィンドウで、使用するイメージを指定するまたはスプラッシュ スクリーンします。Starting in the .NET Framework 3.5 SP1.NET Framework 3.5 SP1, you can specify an image to be used in a startup window, or splash screen. SplashScreenクラスでは、簡単に、アプリケーションの読み込み中に、スタートアップ ウィンドウを表示します。The SplashScreen class makes it easy to display a startup window while your application is loading. SplashScreenウィンドウが作成され、表示する前にRunが呼び出されます。The SplashScreen window is created and shown before Run is called. 詳細については、次を参照してください。アプリケーションの起動時間スプラッシュ スクリーンを WPF アプリケーションに追加します。For more information, see Application Startup Time and Add a Splash Screen to a WPF Application.

アプリケーションの起動Starting an Application

Runが呼び出されますと、アプリケーションが初期化される、アプリケーションを実行する準備ができます。After Run is called and the application is initialized, the application is ready to run. ときにこの時点で表されますが、Startupイベントが発生します。This moment is signified when the Startup event is raised:

using System.Windows;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Application is running
        }
    }
}
Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Application is running
        End Sub
    End Class
End Namespace

この時点で、アプリケーションの有効期間は最も一般的なすは UI を表示します。At this point in an application's lifetime, the most common thing to do is to show a UI.

ユーザー インターフェイスの表示Showing a User Interface

ほとんどのスタンドアロンの Windows アプリケーションを開く、Window開始時期を実行します。Most standalone Windows applications open a Window when they begin running. Startup次のコードに示すように、イベント ハンドラーが 1 つの場所がこれを行うことができます。The Startup event handler is one location from which you can do this, as demonstrated by the following code.

<Application
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App" 
  Startup="App_Startup" />
using System.Windows;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Open a window
            MainWindow window = new MainWindow();
            window.Show();
        }
    }
}

Imports Microsoft.VisualBasic
Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Open a window
            Dim window As New MainWindow()
            window.Show()
        End Sub
    End Class
End Namespace

注意

最初のWindowスタンドアロンのインスタンス化される、既定で、アプリケーションでアプリケーションのメイン ウィンドウになります。The first Window to be instantiated in a standalone application becomes the main application window by default. これは、Windowによってオブジェクトが参照される、Application.MainWindowプロパティ。This Window object is referenced by the Application.MainWindow property. 値、MainWindow場合最初よりも、別のウィンドウにプロパティをプログラムで変更することができますをインスタンス化Windowメイン ウィンドウにする必要があります。The value of the MainWindow property can be changed programmatically if a different window than the first instantiated Window should be the main window.

移動が多くの場合、XBAP を最初に起動するとき、Pageします。When an XBAP first starts, it will most likely navigate to a Page. これを次のコードに示します。This is shown in the following code.

<Application 
  x:Class="SDKSample.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Startup="App_Startup" />
using System;
using System.Windows;
using System.Windows.Navigation;

namespace SDKSample
{
    public partial class App : Application
    {        
        void App_Startup(object sender, StartupEventArgs e)
        {
            ((NavigationWindow)this.MainWindow).Navigate(new Uri("HomePage.xaml", UriKind.Relative));
        }
    }
}

Imports System
Imports System.Windows
Imports System.Windows.Navigation

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            CType(Me.MainWindow, NavigationWindow).Navigate(New Uri("HomePage.xaml", UriKind.Relative))
        End Sub
    End Class
End Namespace

処理する場合Startupのみ開く、Windowかに移動して、Pageを設定することができます、StartupUriマークアップ属性の代わりにします。If you handle Startup to only open a Window or navigate to a Page, you can set the StartupUri attribute in markup instead.

次の例は、使用する方法を示します、StartupUri開くためのスタンドアロン アプリケーションから、Windowします。The following example shows how to use the StartupUri from a standalone application to open a Window.

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

次の例は、使用する方法を示しますStartupUriXBAP に移動しますから、Pageします。The following example shows how to use StartupUri from an XBAP to navigate to a Page.

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

このマークアップは、ウィンドウを開くことについて、前のコードと同じ効果があります。This markup has the same effect as the previous code for opening a window.

注意

ナビゲーションの詳細については、次を参照してください。ナビゲーションの概要します。For more information on navigation, see Navigation Overview.

処理する必要がある、Startupを開くイベント、Window既定以外のコンス トラクターを使用してインスタンス化する必要があるまたはそのプロパティを設定または表示するには、前に、そのイベントをサブスクライブする必要があるコマンドライン引数を処理する必要がある場合ですアプリケーションを起動したときに指定されました。You need to handle the Startup event to open a Window if you need to instantiate it using a non-default constructor, or you need to set its properties or subscribe to its events before showing it, or you need to process any command-line arguments that were supplied when the application was launched.

コマンド ライン引数の処理Processing Command-Line Arguments

、Windows では、コマンド プロンプトまたはデスクトップのいずれかからスタンドアロン アプリケーションを起動できます。In Windows, standalone applications can be launched from either a command prompt or the desktop. どちらの場合も、コマンド ライン引数をアプリケーションに渡すことができます。In both cases, command-line arguments can be passed to the application. 次の例は、1 つのコマンド ライン引数 "/StartMinimized" を指定して起動されるアプリケーションを示しています。The following example shows an application that is launched with a single command-line argument, "/StartMinimized":

wpfapplication.exe /StartMinimized

WPF、アプリケーションの初期化中に、オペレーティング システムからコマンドライン引数を取得およびコマンドを渡し、Startupイベント ハンドラーを使用して、Argsのプロパティ、StartupEventArgsパラメーター。During application initialization, WPF retrieves the command-line arguments from the operating system and passes them to the Startup event handler via the Args property of the StartupEventArgs parameter. 次のようなコードを使用して、コマンド ライン引数を取得し、格納することができます。You can retrieve and store the command-line arguments using code like the following.

<Application
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  Startup="App_Startup" />
using System.Windows;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            // Application is running
            // Process command line args
            bool startMinimized = false;
            for (int i = 0; i != e.Args.Length; ++i)
            {
                if (e.Args[i] == "/StartMinimized")
                {
                    startMinimized = true;
                }
            }

            // Create main application window, starting minimized if specified
            MainWindow mainWindow = new MainWindow();
            if (startMinimized)
            {
                mainWindow.WindowState = WindowState.Minimized;
            }
            mainWindow.Show();
        }
    }
}

Imports Microsoft.VisualBasic
Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Application is running
            ' Process command line args
            Dim startMinimized As Boolean = False
            Dim i As Integer = 0
            Do While i <> e.Args.Length
                If e.Args(i) = "/StartMinimized" Then
                    startMinimized = True
                End If
                i += 1
            Loop

            ' Create main application window, starting minimized if specified
            Dim mainWindow As New MainWindow()
            If startMinimized Then
                mainWindow.WindowState = WindowState.Minimized
            End If
            mainWindow.Show()
        End Sub
    End Class
End Namespace

コード ハンドルStartupを確認するかどうか、 /StartMinimizedコマンドライン引数が指定されました。 メイン ウィンドウに開いた場合は、をWindowStateMinimizedします。The code handles Startup to check whether the /StartMinimized command-line argument was provided; if so, it opens the main window with a WindowState of Minimized. ため、WindowStateプロパティ プログラムでは、メインWindowコードで明示的に開く必要があります。Note that because the WindowState property must be set programmatically, the main Window must be opened explicitly in code.

Xbap は取得できず、ClickOnce 配置を使用して起動するためにコマンドライン引数を処理 (を参照してくださいWPF アプリケーションの配置)。XBAPs cannot retrieve and process command-line arguments because they are launched using ClickOnce deployment (see Deploying a WPF Application). ただし、起動に使用される URL のクエリ文字列パラメーターを取得して処理することはできます。However, they can retrieve and process query string parameters from the URLs that are used to launch them.

アプリケーションのアクティブ化と非アクティブ化Application Activation and Deactivation

Windows では、アプリケーションを切り替えることができます。Windows allows users to switch between applications. 最も一般的な方法は、Alt キーを押しながら Tab キーを押す方法です。The most common way is to use the ALT+TAB key combination. 表示されている場合、アプリケーションに切り替えるだけできますWindow項目を選択できます。An application can only be switched to if it has a visible Window that a user can select. 現在選択されているWindowは、アクティブなウィンドウ(とも呼ばれます、フォア グラウンド ウィンドウ) であり、Windowユーザー入力を受け取る。The currently selected Window is the active window (also known as the foreground window) and is the Window that receives user input. アクティブなウィンドウにアプリケーションが、アクティブなアプリケーション(またはフォア グラウンド アプリケーション)。The application with the active window is the active application (or foreground application). アプリケーションは、次の状況でアクティブ アプリケーションになります。An application becomes the active application in the following circumstances:

  • 起動しを示しています、Windowします。It is launched and shows a Window.

  • 選択して、ユーザーが別のアプリケーションから切り替えた、Windowアプリケーションにします。A user switches from another application by selecting a Window in the application.

処理することにより、アプリケーションがアクティブになったときに検出することができます、Application.Activatedイベント。You can detect when an application becomes active by handling the Application.Activated event.

同様に、アプリケーションは、次の状況で非アクティブになります。Likewise, an application can become inactive in the following circumstances:

  • ユーザーが現在のアプリケーションから別のアプリケーションに切り替えた。A user switches to another application from the current one.

  • アプリケーションがシャットダウンされた。When the application shuts down.

処理することにより、アプリケーションが非アクティブになったときに検出することができます、Application.Deactivatedイベント。You can detect when an application becomes inactive by handling the Application.Deactivated event.

次のコードを処理する方法を示しています、ActivatedDeactivatedアプリケーションがアクティブかどうかを確認するイベントです。The following code shows how to handle the Activated and Deactivated events to determine whether an application is active.

<Application 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  StartupUri="MainWindow.xaml"
  Activated="App_Activated" 
  Deactivated="App_Deactivated" />
using System;
using System.Windows;

namespace SDKSample
{
    public partial class App : Application
    {
        bool isApplicationActive;

        void App_Activated(object sender, EventArgs e)
        {
            // Application activated
            this.isApplicationActive = true;
        }

        void App_Deactivated(object sender, EventArgs e)
        {
            // Application deactivated
            this.isApplicationActive = false;
        }
    }
}

Imports Microsoft.VisualBasic
Imports System
Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private isApplicationActive As Boolean

        Private Sub App_Activated(ByVal sender As Object, ByVal e As EventArgs)
            ' Application activated
            Me.isApplicationActive = True
        End Sub

        Private Sub App_Deactivated(ByVal sender As Object, ByVal e As EventArgs)
            ' Application deactivated
            Me.isApplicationActive = False
        End Sub
    End Class
End Namespace

AWindowアクティブおよび非アクティブ化できるはもします。A Window can also be activated and deactivated. 詳細については、「Window.Activated」および「Window.Deactivated」を参照してください。See Window.Activated and Window.Deactivated for more information.

注意

どちらもApplication.ActivatedApplication.DeactivatedXbap が発生します。Neither Application.Activated nor Application.Deactivated is raised for XBAPs.

アプリケーションのシャットダウンApplication Shutdown

アプリケーションの有効期間は、シャット ダウンされると終了します。シャットダウンは、次の理由で発生します。The life of an application ends when it is shut down, which can occur for the following reasons:

  • ユーザーが閉じたすべてWindowします。A user closes every Window.

  • ユーザーがメインを閉じたWindowします。A user closes the main Window.

  • ユーザーは、ログオフまたはシャット ダウンによって、Windows セッションを終了します。A user ends the Windows session by logging off or shutting down.

  • アプリケーション固有の条件が満たされた。An application-specific condition has been met.

アプリケーションのシャット ダウンの管理に役立つApplicationを提供します、Shutdownメソッド、ShutdownModeプロパティ、およびSessionEndingExitイベント。To help you manage application shutdown, Application provides the Shutdown method, the ShutdownMode property, and the SessionEnding and Exit events.

注意

Shutdown 持つアプリケーションから呼び出すことができますのみUIPermissionします。Shutdown can only be called from applications that have UIPermission. スタンドアロン WPF アプリケーションには、常に、このアクセス許可があります。Standalone WPF applications always have this permission. ただし、インターネット ゾーン部分信頼セキュリティ サンド ボックスで実行されている Xbap は必要ありません。However, XBAPs running in the Internet zone partial-trust security sandbox do not.

シャットダウン モードShutdown Mode

ほとんどのアプリケーションは、すべてのウィンドウが閉じられるか、メイン ウィンドウが閉じられたときにシャットダウンします。Most applications shut down either when all the windows are closed or when the main window is closed. ただし、場合によっては、他のアプリケーションに固有の条件によって、アプリケーションがシャット ダウンするタイミングに影響します。Sometimes, however, other application-specific conditions may determine when an application shuts down. アプリケーションがシャットを設定して、条件を指定するShutdownMode、次のいずれかでShutdownMode列挙値。You can specify the conditions under which your application will shut down by setting ShutdownMode with one of the following ShutdownMode enumeration values:

既定値ShutdownModeOnLastWindowCloseアプリケーションに自動的にシャット ダウン、ユーザーがアプリケーションの最後のウィンドウを閉じたときのことを意味します。The default value of ShutdownMode is OnLastWindowClose, which means that an application automatically shuts down when the last window in the application is closed by the user. ただし場合は、アプリケーションはメイン ウィンドウが閉じられたときに、シャット ダウンする必要があります、WPF が自動的を設定した場合ShutdownModeOnMainWindowCloseします。However, if your application should be shut down when the main window is closed, WPF automatically does that if you set ShutdownMode to OnMainWindowClose. これを次の例に示します。This is shown in the following example.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    ShutdownMode="OnMainWindowClose" />

設定するときに、アプリケーション固有のシャット ダウン条件がある場合は、ShutdownModeOnExplicitShutdownします。When you have application-specific shutdown conditions, you set ShutdownMode to OnExplicitShutdown. 明示的に呼び出すことによって、アプリケーションをシャット ダウンする必要がここで、Shutdownメソッドです。 それ以外の場合、アプリケーションが引き続きすべてのウィンドウを閉じた場合でも実行します。In this case, it is your responsibility to shut an application down by explicitly calling the Shutdown method; otherwise, your application will continue running even if all the windows are closed. なおShutdown暗黙的にすると呼び出されます、ShutdownModeOnLastWindowCloseまたはOnMainWindowCloseします。Note that Shutdown is called implicitly when the ShutdownMode is either OnLastWindowClose or OnMainWindowClose.

注意

ShutdownMode XBAP から設定できますが、無視されます。ブラウザーまたは XBAP をホストするブラウザーが閉じられたときから移動、ときに、常に、XBAP はシャット ダウンです。ShutdownMode can be set from an XBAP, but it is ignored; an XBAP is always shut down when it is navigated away from in a browser or when the browser that hosts the XBAP is closed. 詳細については、「ナビゲーションの概要」を参照してください。For more information, see Navigation Overview.

セッションの終了Session Ending

によって記述されるシャット ダウン条件、ShutdownModeプロパティは、アプリケーションに固有です。The shutdown conditions that are described by the ShutdownMode property are specific to an application. ただし、場合によっては、アプリケーションは、外部条件の結果としてシャットダウンすることもあります。In some cases, though, an application may shut down as a result of an external condition. 最も一般的な外部条件は、ユーザーは、次の操作を Windows セッションを終了したときに発生します。The most common external condition occurs when a user ends the Windows session by the following actions:

  • ログオフLogging off

  • シャット ダウンShutting down

  • 再起動Restarting

  • 休止Hibernating

Windows セッションが終了を検出するには、処理、SessionEndingイベントは、次の例に示すようにします。To detect when a Windows session ends, you can handle the SessionEnding event, as illustrated in the following example.

<Application 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="MainWindow.xaml"
    SessionEnding="App_SessionEnding" />
using System.Windows;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_SessionEnding(object sender, SessionEndingCancelEventArgs e)
        {
            // Ask the user if they want to allow the session to end
            string msg = string.Format("{0}. End session?", e.ReasonSessionEnding);
            MessageBoxResult result = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo);

            // End session, if specified
            if (result == MessageBoxResult.No)
            {
                e.Cancel = true;
            }
        }
    }
}

Imports Microsoft.VisualBasic
Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_SessionEnding(ByVal sender As Object, ByVal e As SessionEndingCancelEventArgs)
            ' Ask the user if they want to allow the session to end
            Dim msg As String = String.Format("{0}. End session?", e.ReasonSessionEnding)
            Dim result As MessageBoxResult = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo)

            ' End session, if specified
            If result = MessageBoxResult.No Then
                e.Cancel = True
            End If
        End Sub
    End Class
End Namespace

この例で、コードの検査、 ReasonSessionEnding Windows セッションが終了する方法を決定するプロパティ。In this example, the code inspects the ReasonSessionEnding property to determine how the Windows session is ending. この値を使用して、ユーザーに確認メッセージを表示します。It uses this value to display a confirmation message to the user. ユーザーがセッションの終了をしない場合、コードが設定CanceltrueWindows セッションを終了に防ぐためにします。If the user does not want the session to end, the code sets Cancel to true to prevent the Windows session from ending.

注意

SessionEnding Xbap は発生しません。SessionEnding is not raised for XBAPs.

終了Exit

アプリケーションがシャット ダウンするときには、アプリケーション状態の保存など、いくつかの最終処理を実行しなければならない場合があります。When an application shuts down, it may need to perform some final processing, such as persisting application state. このような場合は、処理することができます、Exitイベントとして、App_Exitイベント ハンドラーは、次の例です。For these situations, you can handle the Exit event, as the App_Exit event handler does in the following example. 内のイベント ハンドラーとして定義されて、 App.xamlファイル。It is defined as an event handler in the App.xaml file. その実装で強調表示されて、 App.xaml.csApplication.xaml.vbファイル。Its implementation is highlighted in the App.xaml.cs and Application.xaml.vb files.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="MainWindow.xaml" 
    Startup="App_Startup" 
    Exit="App_Exit">
    <Application.Resources>
        <SolidColorBrush x:Key="ApplicationScopeResource" Color="White"></SolidColorBrush>
    </Application.Resources>
</Application>
using System.Windows;
using System.IO;
using System.IO.IsolatedStorage;

namespace SDKSample
{
    public partial class App : Application
    {
        string filename = "App.txt";

        public App()
        {
            // Initialize application-scope property
            this.Properties["NumberOfAppSessions"] = 0;
        }

        private void App_Startup(object sender, StartupEventArgs e)
        {
            // Restore application-scope property from isolated storage
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForDomain();
            try
            {
                using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filename, FileMode.Open, storage))
                using (StreamReader reader = new StreamReader(stream))
                {
                    // Restore each application-scope property individually
                    while (!reader.EndOfStream)
                    {
                        string[] keyValue = reader.ReadLine().Split(new char[] {','});
                        this.Properties[keyValue[0]] = keyValue[1];
                    }
                }
            }
            catch (FileNotFoundException ex)
            {
                // Handle when file is not found in isolated storage:
                // * When the first application session
                // * When file has been deleted
            }
        }

        private void App_Exit(object sender, ExitEventArgs e)
        {
            // Persist application-scope property to isolated storage
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForDomain();
            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filename, FileMode.Create, storage))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                // Persist each application-scope property individually
                foreach (string key in this.Properties.Keys)
                {
                    writer.WriteLine("{0},{1}", key, this.Properties[key]);
                }
            }
        }
    }
}
Imports System.IO
Imports System.IO.IsolatedStorage

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private filename As String = "App.txt"

        Public Sub New()
            ' Initialize application-scope property
            Me.Properties("NumberOfAppSessions") = 0
        End Sub

        Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
            ' Restore application-scope property from isolated storage
            Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForDomain()
            Try
                Using stream As New IsolatedStorageFileStream(filename, FileMode.Open, storage)
                Using reader As New StreamReader(stream)
                    ' Restore each application-scope property individually
                    Do While Not reader.EndOfStream
                        Dim keyValue() As String = reader.ReadLine().Split(New Char() {","c})
                        Me.Properties(keyValue(0)) = keyValue(1)
                    Loop
                End Using
                End Using
            Catch ex As FileNotFoundException
                ' Handle when file is not found in isolated storage:
                ' * When the first application session
                ' * When file has been deleted
            End Try
        End Sub

        Private Sub App_Exit(ByVal sender As Object, ByVal e As ExitEventArgs)
            ' Persist application-scope property to isolated storage
            Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForDomain()
            Using stream As New IsolatedStorageFileStream(filename, FileMode.Create, storage)
            Using writer As New StreamWriter(stream)
                ' Persist each application-scope property individually
                For Each key As String In Me.Properties.Keys
                    writer.WriteLine("{0},{1}", key, Me.Properties(key))
                Next key
            End Using
            End Using
        End Sub
    End Class
End Namespace

完全な例では、次を参照してください。を永続化およびアプリケーション セッション全体でアプリケーション スコープのプロパティを復元します。For the complete example, see Persist and Restore Application-Scope Properties Across Application Sessions.

Exit スタンドアロン アプリケーションと Xbap の両方で処理できます。Exit can be handled by both standalone applications and XBAPs. Xbap のExitは、次の状況で発生します。For XBAPs, Exit is raised when in the following circumstances:

  • XBAP はから移動します。An XBAP is navigated away from.

  • Internet Explorer 7Internet Explorer 7XBAP をホストするタブが閉じられたときに、します。In Internet Explorer 7Internet Explorer 7, when the tab that is hosting the XBAP is closed.

  • ブラウザーが閉じられた。When the browser is closed.

終了コードExit Code

ほとんどのアプリケーションは、ユーザー要求に応じてオペレーティング システムから起動されます。Applications are mostly launched by the operating system in response to a user request. ただし、アプリケーションは、特定のタスクを実行するために、別のアプリケーションに起動されることもあります。However, an application can be launched by another application to perform some specific task. 起動されたアプリケーションがシャット ダウンするとき、起動元のアプリケーションは、起動されたアプリケーションのシャット ダウン条件を知ならなければならないことがあります。When the launched application shuts down, the launching application may want to know the condition under which the launched application shut down. このような状況では、Windows は、アプリケーションをシャット ダウン時にアプリケーション終了コードを返すをできます。In these situations, Windows allows applications to return an application exit code on shutdown. 既定では、WPF アプリケーションには、終了コード値 0 が返されます。By default, WPF applications return an exit code value of 0.

注意

アプリケーションの終了コードが表示される Visual Studio からデバッグするときに、出力ウィンドウで、次のようなメッセージ、アプリケーションのシャット ダウン、時。When you debug from Visual Studio, the application exit code is displayed in the Output window when the application shuts down, in a message that looks like the following:

The program '[5340] AWPFApp.vshost.exe: Managed' has exited with code 0 (0x0).

開く、出力をクリックしてウィンドウ出力上、ビューメニュー。You open the Output window by clicking Output on the View menu.

終了コードを変更するを呼び出すことができます、Shutdown(Int32)整数の引数の終了コードを受け取る、オーバー ロードします。To change the exit code, you can call the Shutdown(Int32) overload, which accepts an integer argument to be the exit code:

// Shutdown and return a non-default exit code
Application.Current.Shutdown(-1);
' Shutdown and return a non-default exit code
Application.Current.Shutdown(-1)

終了コードの値を検出して処理することにより、変更、Exitイベント。You can detect the value of the exit code, and change it, by handling the Exit event. Exitイベント ハンドラーに渡される、ExitEventArgsの終了コードへのアクセスを提供する、ApplicationExitCodeプロパティ。The Exit event handler is passed an ExitEventArgs which provides access to the exit code with the ApplicationExitCode property. 詳細については、「 Exit 」を参照してください。For more information, see Exit.

注意

終了コードは、スタンドアロン アプリケーションと Xbap の両方で設定できます。You can set the exit code in both standalone applications and XBAPs. ただし、Xbap の終了コード値が無視されます。However, the exit code value is ignored for XBAPs.

未処理の例外Unhandled Exceptions

ときには、アプリケーションは、予期しない例外がスローされたときなど、異常な条件下でシャットダウンすることがあります。Sometimes an application may shut down under abnormal conditions, such as when an unanticipated exception is thrown. この場合、アプリケーションには、例外を検出して処理するためのコードがありません。In this case, the application may not have the code to detect and process the exception. この種類の例外は、未処理の例外と呼ばれます。アプリケーションが閉じられる前に、次の図に示されているような通知が表示されます。This type of exception is an unhandled exception; a notification similar to that shown in the following figure is displayed before the application is closed.

Unhandled exception notificationUnhandled exception notification

ユーザー エクスペリエンスの観点から、アプリケーションは、次のいずれか、またはすべてを行うことによって、この既定の動作を回避することをお勧めします。From the user experience perspective, it is better for an application to avoid this default behavior by doing some or all of the following:

  • わかりやすい情報を表示する。Displaying user-friendly information.

  • アプリケーションの続行を試みる。Attempting to keep an application running.

  • 記録なは、Windows イベント ログの開発者にとって使いやすい例外情報。Recording detailed, developer-friendly exception information in the Windows event log.

これはどのような未処理の例外を検出できることに依存このサポートを実装する、DispatcherUnhandledExceptionのイベントが発生します。Implementing this support depends on being able to detect unhandled exceptions, which is what the DispatcherUnhandledException event is raised for.

<Application
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.App"
  StartupUri="MainWindow.xaml"
  DispatcherUnhandledException="App_DispatcherUnhandledException" />
using System.Windows;
using System.Windows.Threading;

namespace SDKSample
{
    public partial class App : Application
    {
        void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            // Process unhandled exception

            // Prevent default unhandled exception processing
            e.Handled = true;
        }
    }
}

Imports System.Windows
Imports System.Windows.Threading

Namespace SDKSample
    Partial Public Class App
        Inherits Application
        Private Sub App_DispatcherUnhandledException(ByVal sender As Object, ByVal e As DispatcherUnhandledExceptionEventArgs)
            ' Process unhandled exception

            ' Prevent default unhandled exception processing
            e.Handled = True
        End Sub
    End Class
End Namespace

DispatcherUnhandledExceptionイベント ハンドラーに渡される、DispatcherUnhandledExceptionEventArgs例外自体を含め、未処理の例外に関するコンテキスト情報を含むパラメーター (DispatcherUnhandledExceptionEventArgs.Exception)。The DispatcherUnhandledException event handler is passed a DispatcherUnhandledExceptionEventArgs parameter that contains contextual information regarding the unhandled exception, including the exception itself (DispatcherUnhandledExceptionEventArgs.Exception). この情報を使用して、例外の処理方法を決定できます。You can use this information to determine how to handle the exception.

処理するときにDispatcherUnhandledExceptionを設定する必要があります、DispatcherUnhandledExceptionEventArgs.Handledプロパティをtrue、それ以外の WPF は引き続き例外を処理できないし、前に説明した既定の動作に戻ります。When you handle DispatcherUnhandledException, you should set the DispatcherUnhandledExceptionEventArgs.Handled property to true; otherwise, WPF still considers the exception to be unhandled and reverts to the default behavior described earlier. ハンドルされない例外が発生した場合、どちらか、DispatcherUnhandledExceptionイベントが処理されない、またはイベントを処理し、Handledに設定されているfalseアプリケーションがすぐにシャット ダウンします。If an unhandled exception is raised and either the DispatcherUnhandledException event is not handled, or the event is handled and Handled is set to false, the application shuts down immediately. さらに、他のApplicationイベントが発生します。Furthermore, no other Application events are raised. そのため、処理する必要がありますDispatcherUnhandledException場合は、アプリケーションがあるコードをアプリケーションがシャット ダウンする前に実行する必要があります。Consequently, you need to handle DispatcherUnhandledException if your application has code that must run before the application shuts down.

アプリケーションは、未処理の例外の結果としてシャットダウンすることがありますが、通常は、次のセクションで説明されているように、ユーザーの要求に応じてシャットダウンします。Although an application may shut down as a result of an unhandled exception, an application usually shuts down in response to a user request, as discussed in the next section.

アプリケーションの有効期間イベントApplication Lifetime Events

Xbap のスタンドアロン アプリケーションとまったく同じ有効期間はありません。Standalone applications and XBAPs don't have exactly the same lifetimes. 次の図は、スタンドアロン アプリケーションの有効期間中の主なイベントと発生順を示しています。The following figure illustrates the key events in the lifetime of a standalone application and shows the sequence in which they are raised.

スタンドアロン アプリケーション - アプリケーション オブジェクト イベントStandalone Application - Application Object Events

同様に、次の図は、XBAP の有効期間における主なイベントを示していて、発生するシーケンスを示しています。Likewise, the following figure illustrates the key events in the lifetime of an XBAP, and shows the sequence in which they are raised.

XBAP - アプリケーション オブジェクト イベントXBAP - Application Object Events

関連項目See also