# 画面設計書 104-Button

## 概要

本ドキュメントは、IntegrationTestAppにおけるボタンコントロールのテストページ（ButtonPage）の画面設計書です。

### 本画面の処理概要

本画面は、Avaloniaフレームワークのボタンコントロール機能を統合テストするためのテストページです。ボタンの有効/無効状態、コマンドバインディングによる有効状態制御、アクセラレータキー（HotKey）などの機能をテストできます。

**業務上の目的・背景**：本画面は、Avaloniaフレームワークの品質保証のために存在します。ボタンコントロールは、ユーザーインタラクションの基本要素であり、様々なシナリオでの動作確認が必要です。特に、IsEnabledプロパティによる明示的な無効化、コマンドバインディングによる暗黙的な無効化（CanExecute=false）、HotKeyによるキーボードショートカットなどの機能が正しく動作することを検証します。

**画面へのアクセス方法**：IntegrationTestAppのメインウィンドウから、ListBoxナビゲーションで「Button」項目を選択することでアクセスします。

**主要な操作・処理内容**：
1. 無効化されたボタン（DisabledButton）のクリック不可を確認
2. コマンドバインディングにより無効化されたボタン（EffectivelyDisabledButton）のクリック不可を確認
3. 基本ボタン（BasicButton）のクリック動作を確認
4. TextBlockを含むボタン（ButtonWithTextBlock）の表示を確認
5. アクセラレータキー付きボタン（ButtonWithAcceleratorKey）のCtrl+B操作を確認

**画面遷移**：
- 遷移元：IntegrationTestApp MainWindow（ListBoxナビゲーション）
- 遷移先：なし（テストページ単体）

**権限による表示制御**：本画面は統合テスト用のため、権限による表示制御は実装されていません。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | Button | 主機能 | ボタンのテスト。標準ボタン、無効化ボタン、HotKey付きボタン |

## 画面種別

テスト画面

## URL/ルーティング

IntegrationTestApp内のUserControlとして読み込まれるため、URLルーティングはありません。
クラス名: `IntegrationTestApp.Pages.ButtonPage`

## 入出力項目

本画面には明示的な入出力項目はありません。ボタンの状態確認に特化したテストページです。

## 表示項目

| 項目名 | コントロール名 | 種別 | 説明 |
|--------|--------------|------|------|
| Disabled Button | DisabledButton | Button | 明示的に無効化されたボタン（IsEnabled="False"） |
| Effectively Disabled Button | EffectivelyDisabledButton | Button | コマンドバインディングにより無効化されたボタン |
| Basic Button | BasicButton | Button | 基本的な有効ボタン |
| Button with TextBlock | ButtonWithTextBlock | Button | TextBlockを子要素として持つボタン |
| Button with Accelerator Key | ButtonWithAcceleratorKey | Button | HotKey="Ctrl+B"が設定されたボタン |

## イベント仕様

本画面のボタンには明示的なClickイベントハンドラが設定されていません。UIオートメーションテストでの動作確認を目的としています。

### 1-HotKey (Ctrl+B)

ButtonWithAcceleratorKeyに設定されたホットキーが押された際に発火します。

**処理フロー**:
1. Ctrl+Bキーの組み合わせを検出
2. ButtonWithAcceleratorKeyのClickイベントを自動発火

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

本画面はUIテスト用であり、データベースとの連携はありません。

## メッセージ仕様

本画面では明示的なメッセージ表示はありません。

## 例外処理

| 例外状況 | 処理内容 |
|---------|---------|
| 存在しないコマンドへのバインディング | CanExecuteがfalseとなり、ボタンが無効化される |

## 備考

- DisabledButtonは`IsEnabled="False"`で明示的に無効化されています
- EffectivelyDisabledButtonは`Command="{ReflectionBinding DoesntExist}"`で、存在しないコマンドにバインドされているため、CanExecute=falseとなり暗黙的に無効化されます
- ButtonWithTextBlockは、ボタンのContentにTextBlockを含めることができることを示しています
- HotKey="Ctrl+B"は、キーボードショートカットでボタンを操作できることを示しています

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

ボタンコントロールの基本構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Button.cs | `src/Avalonia.Controls/Button.cs` | ボタンコントロールの基本クラス |
| 1-2 | HotKeyManager.cs | `src/Avalonia.Controls/HotKeyManager.cs` | HotKey機能の実装 |

**読解のコツ**: ButtonはContentControlを継承しており、任意のコンテンツを表示できます。HotKeyプロパティはKeyGesture型で、キーボードショートカットを設定します。

#### Step 2: エントリーポイントを理解する

処理の起点となるXAMLファイルとコードビハインドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | ButtonPage.axaml | `samples/IntegrationTestApp/Pages/ButtonPage.axaml` | 画面レイアウトとボタン定義 |
| 2-2 | ButtonPage.axaml.cs | `samples/IntegrationTestApp/Pages/ButtonPage.axaml.cs` | コードビハインド（最小限の実装） |

**主要処理フロー**:
1. **行8-10**: DisabledButtonをIsEnabled="False"で定義
2. **行11-13**: EffectivelyDisabledButtonを存在しないコマンドにバインド
3. **行14-16**: BasicButtonを通常状態で定義
4. **行17-19**: ButtonWithTextBlockにTextBlockを子要素として配置
5. **行20**: ButtonWithAcceleratorKeyにHotKey="Ctrl+B"を設定

#### Step 3: コマンドバインディングを理解する

コマンドによるボタンの有効/無効制御を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | CommandBinder.cs | `src/Avalonia.Base/Data/Core/Plugins/CommandValueConverter.cs` | コマンドバインディングの実装 |

**主要処理フロー**:
- バインディングが解決できない場合、CanExecuteはfalseを返す
- CanExecute=falseの場合、ボタンのIsEnabledが自動的にfalseになる

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

```
ButtonPage (UserControl)
    │
    └─ StackPanel
           │
           ├─ DisabledButton
           │      └─ IsEnabled = False (明示的無効化)
           │
           ├─ EffectivelyDisabledButton
           │      └─ Command = {ReflectionBinding DoesntExist}
           │              └─ バインディング解決失敗 → CanExecute = false → IsEnabled = false
           │
           ├─ BasicButton
           │      └─ 通常の有効状態
           │
           ├─ ButtonWithTextBlock
           │      └─ Content = TextBlock { Text = "Button with TextBlock" }
           │
           └─ ButtonWithAcceleratorKey
                  └─ HotKey = "Ctrl+B"
                         └─ KeyGesture → HotKeyManager登録 → キー検出時にClick発火
```

### データフロー図

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

IsEnabled="False" ───▶ Button.IsEnabled = false ───▶ 視覚的無効化

Command binding failed ───▶ CanExecute = false ───▶ IsEnabled = false
                                                        │
                                                        ▼
                                                   視覚的無効化

Ctrl+B keypress ───▶ HotKeyManager検出 ───▶ Button.Click発火
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| ButtonPage.axaml | `samples/IntegrationTestApp/Pages/ButtonPage.axaml` | ソース | 画面レイアウト定義（XAML） |
| ButtonPage.axaml.cs | `samples/IntegrationTestApp/Pages/ButtonPage.axaml.cs` | ソース | コードビハインド（最小限の初期化のみ） |
| MainWindow.axaml | `samples/IntegrationTestApp/MainWindow.axaml` | ソース | 親ウィンドウ（ナビゲーション） |
| Button.cs | `src/Avalonia.Controls/Button.cs` | ソース | ボタンコントロールの実装 |
| HotKeyManager.cs | `src/Avalonia.Controls/HotKeyManager.cs` | ソース | ホットキー管理クラス |
