# 画面設計書 113-メインウィンドウ

## 概要

本ドキュメントは、AppWithoutLifetimeサンプルアプリケーションにおけるメインウィンドウの画面設計書である。このアプリケーションは、Avaloniaの標準的なライフサイクル管理を使用せずにアプリケーションを実行する方法をデモンストレーションしている。

### 本画面の処理概要

この画面は、シンプルなUIを持つメインウィンドウで、Avaloniaアプリケーションの特殊なライフサイクル管理パターンをデモンストレーションする。ボタンをクリックすることでサブウィンドウを開く機能を提供する。

**業務上の目的・背景**：Avaloniaフレームワークでは通常、IClassicDesktopStyleApplicationLifetimeを使用してアプリケーションのライフサイクルを管理する。しかし、特定のユースケース（既存アプリケーションへの組み込み、カスタムライフサイクル管理等）では、この標準パターンを使用しない場合がある。本サンプルは、そのような場合の実装パターンを示している。開発者がAvaloniaの柔軟なアーキテクチャを理解し、様々な統合シナリオに対応できるようにすることが目的。

**画面へのアクセス方法**：AppWithoutLifetimeアプリケーションを起動すると、Program.csのAppMainメソッドでApplication.Run(MainWindow)が呼び出され、このメインウィンドウが表示される。

**主要な操作・処理内容**：
1. テキスト表示の確認：「Welcome to Avalonia!」テキストを表示
2. CheckBox操作：チェックボックスの状態を変更
3. サブウィンドウを開く：「Open」ボタンをクリックしてSubウィンドウを表示

**画面遷移**：
- 遷移元：アプリケーション起動（Program.cs経由）
- 遷移先：Subウィンドウ（No.114）を新規ウィンドウとして表示

**権限による表示制御**：特になし

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 42 | Window | 主機能 | Lifetime無しアプリのメインウィンドウ表示 |
| 43 | Application | 補助機能 | 特殊なライフサイクル管理 |

## 画面種別

メイン / デモ

## URL/ルーティング

該当なし（デスクトップアプリケーション）

## 入出力項目

| 項目名 | 種別 | データ型 | 必須 | 初期値 | 説明 |
|--------|------|----------|------|--------|------|
| CheckBox.IsChecked | 入力 | bool? | - | false | チェックボックスの状態 |

## 表示項目

| 項目名 | 表示位置 | 説明 |
|--------|----------|------|
| ウェルカムテキスト | 上部 | 「Welcome to Avalonia!」テキスト |
| チェックボックス | 中央 | 「Welcome to Avalonia!」ラベル付きチェックボックス |
| Openボタン | 下部 | サブウィンドウを開くボタン |

## イベント仕様

### 1-Openボタンクリック

「Open」ボタンをクリックすると、Subウィンドウが開く。

- **トリガー**：Button Click
- **処理フロー**（MainWindow.axaml.cs 19-22行目）：
  1. new Sub()でSubウィンドウインスタンスを生成
  2. Show(this)でメインウィンドウを親として表示

### 2-ウィンドウクローズ

メインウィンドウが閉じられると、アプリケーションが終了する。

- **トリガー**：ウィンドウの閉じる操作
- **処理フロー**：
  1. Application.Run()ループが終了
  2. アプリケーションプロセスが終了

## データベース更新仕様

### 操作別データベース影響一覧

該当なし（データベースを使用しない）

## メッセージ仕様

該当なし

## 例外処理

該当なし（シンプルなデモアプリケーション）

## 備考

- 標準的なClassicDesktopStyleApplicationLifetimeを使用せず、直接Application.Run(Window)を呼び出すパターン
- ウィンドウデザインサイズは800x450
- 開発者向けツール（WithDeveloperTools）が有効化されている
- Subウィンドウは所有ウィンドウとして開かれる（Show(this)）

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: アプリケーション起動フローを理解する

標準ライフサイクルを使用しない起動パターンを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Program.cs | `samples/AppWithoutLifetime/Program.cs` | Main→AppMain→Application.Run(MainWindow)の流れ |

**読解のコツ**: 通常のAvaloniaアプリではStartupMain等でLifetimeが設定されるが、このサンプルではBuildAvaloniaApp().Start(AppMain, args)を使用し、AppMain内で直接app.Run(new MainWindow())を呼び出している点が特徴。

**主要処理フロー**:
- **13-16行目**: Mainメソッドで BuildAvaloniaApp().Start(AppMain, args) を呼び出し
- **18-21行目**: AppMainメソッドでApplication.Run(MainWindow)を直接呼び出し
- **24-28行目**: BuildAvaloniaAppでアプリケーション設定（WithDeveloperTools有効）

#### Step 2: UI定義を理解する

XAMLファイルでUIレイアウトを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | MainWindow.axaml | `samples/AppWithoutLifetime/MainWindow.axaml` | シンプルなStackPanel構成、ボタンのClickイベント |

**主要処理フロー**:
- **7行目**: ウィンドウタイトル「AppWithoutLifetime」
- **8-12行目**: StackPanel内にTextBlock、CheckBox、Buttonを配置
- **11行目**: ButtonのClick="Open"でOpenメソッドを呼び出し

#### Step 3: イベントハンドラを理解する

コードビハインドでのイベント処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | MainWindow.axaml.cs | `samples/AppWithoutLifetime/MainWindow.axaml.cs` | Openメソッドでのサブウィンドウ表示 |

**主要処理フロー**:
- **9-12行目**: コンストラクタでInitializeComponentを呼び出し
- **14-17行目**: InitializeComponentでAvaloniaXamlLoader.Load(this)
- **19-22行目**: Openメソッドでnew Sub().Show(this)

### プログラム呼び出し階層図

```
Program.Main()
    │
    └─ BuildAvaloniaApp().Start(AppMain, args)
           │
           └─ AppMain(app, args)
                  │
                  └─ app.Run(new MainWindow())
                         │
                         ├─ InitializeComponent()
                         │
                         └─ Openボタンクリック時
                                │
                                └─ new Sub().Show(this)
```

### データフロー図

```
[入力]                    [処理]                         [出力]

アプリ起動 ───▶ Program.Main() ───▶ AppBuilder構築
                        │
                        ▼
                 AppMain呼び出し
                        │
                        ▼
                 Application.Run(MainWindow)
                        │
                        ▼
                 MainWindow表示 ───▶ 画面表示
                        │
                        ▼
                 Openボタンクリック ───▶ Sub.Show(this)
                        │
                        ▼
                 サブウィンドウ表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Program.cs | `samples/AppWithoutLifetime/Program.cs` | ソース | アプリケーションエントリーポイント |
| MainWindow.axaml | `samples/AppWithoutLifetime/MainWindow.axaml` | XAML | メインウィンドウUIレイアウト |
| MainWindow.axaml.cs | `samples/AppWithoutLifetime/MainWindow.axaml.cs` | ソース | コードビハインド、イベント処理 |
| Sub.axaml | `samples/AppWithoutLifetime/Sub.axaml` | XAML | サブウィンドウUIレイアウト |
| Sub.axaml.cs | `samples/AppWithoutLifetime/Sub.axaml.cs` | ソース | サブウィンドウコードビハインド |
| App.axaml | `samples/AppWithoutLifetime/App.axaml` | XAML | アプリケーション定義 |
