Window.Activated

Window.Activatedは、ウィンドウがアクティブの時に発生するイベント。

Window.Activated Event (System.Windows) | Microsoft Docs

WPFアプリケーション
WPFアプリケーション

WPFアプリケーションで、

Labelを配置
Labelを配置

Labelを配置。

WindowにActivated
WindowにActivated

WindowにActivated。

イベントハンドラ
イベントハンドラ

イベントハンドラ

Window_Activated
Window_Activated

Window_Activated。

Window_Activatedに来るたびにiを1増やしてlabel1にセット。

最初は1
最初は1

最初は1。

いったん隠して
いったん隠して

いったん隠して、

再表示
再表示

再表示したら、2になっている。

Sample/wpf/Window/Activated/src/Window_ at master · bg1bgst333/Sample · GitHub

FrameworkElement.Loaded

FrameworkElement.Loadedは、ウィンドウのロード時に発生する。

FrameworkElement.Loaded Event (System.Windows) | Microsoft Docs

WPFアプリケーション
WPFアプリケーション

WPFアプリケーションで、

Buttonを配置
Buttonを配置

Buttonを配置。

XAMLでLoadedイベントを追加
XAMLでLoadedイベントを追加

XAMLでWindowにLoadedイベントを追加。

ハンドラを追加
ハンドラを追加

ハンドラを追加。

LoadedはFrameworkElementらしい
LoadedはFrameworkElementらしい

LoadedはFrameworkElementらしい。

Window_Loadedの時にMessageBoxを表示。

ButtonなどWindowがまだ描画完了していない
ButtonなどWindowがまだ描画完了していない

Loadedの時点では、ButtonなどWindowがまだ描画完了していない。

Sample/wpf/FrameworkElement/Loaded/src/FrameworkElement_ at master · bg1bgst333/Sample · GitHub

Form.Shown

Form.Shownは、初めてフォームが表示される時だけ発生する。

Form.Shown Event (System.Windows.Forms) | Microsoft Docs
Windowsフォームの表示直後に初期化処理を行うには?[2.0のみ、C#、VB]:.NET TIPS - @IT
全ては時の中に… : 【VB.NET】Shownイベントについて

Loadは、すぐ終わる初期化処理で使うのに対し、Shownは時間のかかる処理で使うらしい。

labelを3つにする
labelを3つにする

Activatedで使ったプログラムにさらにLabelを増やす。

Shownイベント追加
Shownイベント追加

Shownイベント追加。

Form1_Shownが起こるたびにkを1増やしてlabel3にセット。

最初はすべて1
最初はすべて1

最初はすべて1だが、

いったん非表示
いったん非表示

いったん非表示して、

再度表示
再度表示

再度表示。
Activatedだけ増えてる。Shownは1度だけ。

Sample/dotnet/Form/Shown/src/Form_ at master · bg1bgst333/Sample · GitHub

Application.Exit

WPFでは、アプリケーションが終了する時に発生するイベントはApplication.Exitである。
(WinFormsでは、Application.ApplicationExitなのでややこしい。)

Application.Exit Event (System.Windows) | Microsoft Docs

WPFアプリケーション
WPFアプリケーション

WPFアプリケーションで、

Buttonを追加
Buttonを追加

Buttonを追加。

このように配置
このように配置

このように配置。
Buttonをダブルクリックで、ハンドラが追加されるので、

button1を押したら、App.Current.Shutdownで終了する。
XAMLデザイナに戻って、

Exitイベント
Exitイベント

Exitイベントを選択。

イベントハンドラの追加
イベントハンドラの追加

イベントハンドラを追加。

MessageBoxに加えて、ファイル書き込みも置いておいた。
Debugビルドだと、

Buttonを押す
Buttonを押す

Buttonを押すと、

メッセージボックス表示される
メッセージボックス表示される

メッセージボックス表示される。
Releaseビルドの場合、表示される場合もあれば、表示されない場合もあった。

ファイル書き込み
ファイル書き込み

ファイル書き込みは、

書き込み処理されている
書き込み処理されている

されている。

Sample/wpf/Application/Exit/src/Application_ at master · bg1bgst333/Sample · GitHub

Application.ApplicationExit

Application.ApplicationExitイベントは、アプリケーションが終了する時に発生するイベント。

Application.ApplicationExit Event (System.Windows.Forms) | Microsoft Docs

Windowsアプリケーション
Windowsアプリケーション

Windowsアプリケーションで、

Buttonを選択
Buttonを選択

Buttonを、

このように配置
このように配置

このように配置。
ダブルクリックでbutton1のイベントハンドラを書く。

Application.Exitでアプリを終了。

Program.csに、

using System;
using System.Collections.Generic;
using System.IO;    // ファイル入出力とデータストリーム(System.IO名前空間)
using System.Windows.Forms;

namespace Application_
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.ApplicationExit += new EventHandler(OnApplicationExit); // Application.ApplicationExitにOnApplicationExitをセット.
            Application.Run(new Form1());
        }

        // アプリケーションが終了する時のイベントハンドラ.
        static void OnApplicationExit(object sender, EventArgs e)
        {

            // メッセージボックスを表示.
            MessageBox.Show("OnApplicationExit");   // "OnApplicationExit"を表示.

        }
    }
}

Application.ApplicationExitイベントに、アプリケーションが終了する時のイベントハンドラOnApplicationExitを追加。
メッセージボックスを表示。
ここにブレークポイントを仕掛けておく。

buttonを押す
buttonを押す

button1を押すと、

ブレークポイントに来ている
ブレークポイントに来ている

ブレークポイントに来ている。
ただし、

メッセージボックスは表示されない
メッセージボックスは表示されない

メッセージボックスは表示されない。
終了処理をメッセージボックスのようなものでブロックして止めることはできないようである。
そこで、

終了時にファイルの書き込みをしてみる。
まあログのようなもので、終了処理したことの証拠である。

起動時
起動時

起動したらbutton1を押し、

アプリケーションを終了させる
アプリケーションを終了させる

アプリケーションを終了させる。

test.txtが作られる
test.txtが作られる

test.txtが作られて、

&quot;ABC&quot;が書き込まれる
"ABC"が書き込まれる

"ABC"が書き込まれる。
終了処理自体はできている。

Sample/dotnet/Application/ApplicationExit/src/Application_ at master · bg1bgst333/Sample · GitHub

オプション引数

C#4.0でようやくオプション引数(デフォルト引数)に対応した。

名前付き引数と省略可能な引数 - C# プログラミング ガイド | Microsoft Docs
オプション引数・名前付き引数 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

MainClass.csで、

PrintVectorは指定の3つの整数からなるベクタ値を出力。
yやzは指定されていなければ0とする。
PrintThreeTextは指定の3つの文字列をカンマ区切りで出力。
省略されていれば"-"とする。

(x = 1, y = 2, z = 3)
(x = 1, y = 2, z = 0)
(x = 1, y = 0, z = 0)
(x = 0, y = 0, z = 0)
str1 = ABC, str2 = DEF, str3 = GHI
str1 = ABC, str2 = DEF, str3 = -
str1 = ABC, str2 = -, str3 = -
str1 = -, str2 = -, str3 = -
続行するには何かキーを押してください . . .

省略形の場合は、0や"-"になっている。

Sample/cs/OptionalArguments/OptionalArguments/src/OptionalArguments at master · bg1bgst333/Sample · GitHub

Form.InitializeComponent

InitializeComponentは、.NET Frameworkのクラスでもメソッドでもないプロジェクト作成時に自動追加されるメソッドであるが、ここで基本的にコントロールの初期化をする模様。

第3回 Visual Studio .NETのひな形コードを理解する (6/6):連載簡単!Visual Studio .NET入門 - @IT

Windowsアプリケーション
Windowsアプリケーション

Windowsアプリケーションで、プロジェクト作成。

Form1.cs
Form1.cs

右クリックで、

コードの表示
コードの表示

コードの表示。

InitializeComponent
InitializeComponent

Form1のコンストラクタでInitializeComponentが呼ばれているのがわかる。

定義へ移動
定義へ移動

定義へ移動すると、

Form1.Designer.cs
Form1.Designer.cs

Form1.Designer.csにあるInitializeComponentの定義へ移動。
this.Textに"Form1"をセットしてたりする。

デザイナに戻る
デザイナに戻る

デザイナに戻って、

Loadイベントハンドラ
Loadイベントハンドラ

Loadイベントハンドラと、

Activatedイベントハンドラ
Activatedイベントハンドラ

Activatedイベントハンドラを追加。

Labelを3つ配置
Labelを3つ配置

Labelを3つ配置。

メンバ変数iを0で初期化し、Form1_Loadで1増やしてlabel2にセット、Form1_Activatedでさらに1増やしてlabel3にセット。

Form1.Designer.csのInitializeComponentの最後でiを1増やしてlabel1にセット。

label1, label2, label3の順になってる
label1, label2, label3の順になってる

iの値がlabel1, label2, label3の順になっているので、InitializeComponent、Form1_Load、Form1_Activatedの順で呼ばれているのがわかる。

Sample/dotnet/Form/InitializeComponent/src/Form_ at master · bg1bgst333/Sample · GitHub