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

## はじめに

このガイドラインは、Avaloniaのコードベースを効率的に理解するための手引きです。
C#/.NET及びXAMLベースのUIフレームワークに精通していないエンジニアでも、段階的に学習できるよう構成されています。

**対象読者:**
- プロジェクトに新規参画するエンジニア
- 他言語からの経験者（特にWPF/UWP経験者）
- コードレビューを行う担当者

---

## 1. 言語基礎

> このセクションでは、C#の基本構文と概念を解説します。

### 1.1 プログラム構造

Avaloniaは.NET/C#で記述されたクロスプラットフォームUIフレームワークです。プロジェクトはC# 14.0（LangVersion 14.0）を使用しています。

基本的なファイル構造は以下のようになっています。

```csharp
// src/Avalonia.Controls/Button.cs:14-36
using System;
using System.Diagnostics;
using System.Linq;
using System.Windows.Input;
using Avalonia.Automation.Peers;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives;
using Avalonia.Data;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.LogicalTree;
using Avalonia.VisualTree;

namespace Avalonia.Controls
{
    /// <summary>
    /// A standard button control.
    /// </summary>
    [PseudoClasses(pcFlyoutOpen, pcPressed)]
    public class Button : ContentControl, ICommandSource, IClickableControl
    {
        // ...
    }
}
```

### 1.2 データ型と変数

Avaloniaでは、プロパティシステムとして`AvaloniaProperty`を使用します。これはWPFの`DependencyProperty`に相当します。

**StyledProperty（スタイル可能なプロパティ）:**
```csharp
// src/Avalonia.Controls/Button.cs:46-47
public static readonly StyledProperty<ClickMode> ClickModeProperty =
    AvaloniaProperty.Register<Button, ClickMode>(nameof(ClickMode));
```

**DirectProperty（直接プロパティ）:**
```csharp
// src/Avalonia.Controls/Button.cs:88-89
public static readonly DirectProperty<Button, bool> IsPressedProperty =
    AvaloniaProperty.RegisterDirect<Button, bool>(nameof(IsPressed), b => b.IsPressed);
```

**AttachedProperty（添付プロパティ）:**
```csharp
// src/Avalonia.Base/Visual.cs:106-109
public static readonly AttachedProperty<FlowDirection> FlowDirectionProperty =
    AvaloniaProperty.RegisterAttached<Visual, Visual, FlowDirection>(
        nameof(FlowDirection),
        inherits: true);
```

### 1.3 制御構造

Avaloniaでは、プロパティ変更時の処理を`OnPropertyChanged`メソッドでオーバーライドして行います。

```csharp
// src/Avalonia.Controls/Button.cs:474-552（抜粋）
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
    base.OnPropertyChanged(change);

    if (change.Property == CommandProperty)
    {
        var (oldValue, newValue) = change.GetOldAndNewValue<ICommand?>();
        if (((ILogical)this).IsAttachedToLogicalTree)
        {
            if (oldValue is ICommand oldCommand)
            {
                oldCommand.CanExecuteChanged -= CanExecuteChangedHandler;
            }

            if (newValue is ICommand newCommand)
            {
                newCommand.CanExecuteChanged += CanExecuteChangedHandler;
            }
        }
        CanExecuteChanged(newValue, CommandParameter);
    }
    // ...
}
```

### 1.4 関数/メソッド定義

Avaloniaではイベントハンドラとコールバックパターンを多用します。

**イベント定義:**
```csharp
// src/Avalonia.Controls/Button.cs:82-83
public static readonly RoutedEvent<RoutedEventArgs> ClickEvent =
    RoutedEvent.Register<Button, RoutedEventArgs>(nameof(Click), RoutingStrategies.Bubble);
```

**イベントハンドラ:**
```csharp
// src/Avalonia.Controls/Button.cs:121-125
public event EventHandler<RoutedEventArgs>? Click
{
    add => AddHandler(ClickEvent, value);
    remove => RemoveHandler(ClickEvent, value);
}
```

### 1.5 モジュール/インポート

C#では`using`ディレクティブでモジュールをインポートします。Avaloniaの主要な名前空間は以下の通りです。

| 名前空間 | 説明 |
|---------|------|
| `Avalonia` | コア機能、AvaloniaObjectなど |
| `Avalonia.Controls` | UIコントロール |
| `Avalonia.Controls.Primitives` | 基本コントロール部品 |
| `Avalonia.Input` | 入力処理 |
| `Avalonia.Media` | 描画、ブラシ、ジオメトリ |
| `Avalonia.Styling` | スタイルシステム |
| `Avalonia.Data` | データバインディング |
| `Avalonia.Markup.Xaml` | XAMLパーサー |

---

## 2. プロジェクト固有の概念

> このセクションでは、Avalonia特有の概念を解説します。

### 2.1 フレームワーク固有の概念

#### AvaloniaProperty システム

Avaloniaの中核となるプロパティシステムです。WPFのDependencyPropertyに相当します。

```csharp
// src/Avalonia.Base/AvaloniaObject.cs:24-25
public class AvaloniaObject : IAvaloniaObjectDebug, INotifyPropertyChanged
{
    private readonly ValueStore _values;
    // ...
}
```

#### 継承階層

Avaloniaの主要なクラス継承階層：

```
AvaloniaObject
└── StyledElement
    └── Visual
        └── Layoutable
            └── InputElement
                └── Control
                    └── ContentControl
                    └── TemplatedControl
                        └── Button
                        └── TextBox
                        └── etc.
```

#### ルーテッドイベント

WPF同様、イベントはビジュアルツリーを通じてバブル/トンネルします。

```csharp
// src/Avalonia.Controls/Button.cs:82-83
public static readonly RoutedEvent<RoutedEventArgs> ClickEvent =
    RoutedEvent.Register<Button, RoutedEventArgs>(nameof(Click), RoutingStrategies.Bubble);
```

### 2.2 プロジェクト独自のパターン

#### Looklessコントロールパターン

TemplatedControlを継承し、外観をControlTemplateで定義します。

```csharp
// src/Avalonia.Controls/Primitives/TemplatedControl.cs:17-18
/// <summary>
/// A lookless control whose visual appearance is defined by its <see cref="Template"/>.
/// </summary>
public class TemplatedControl : Control
{
    // ...
}
```

#### PseudoClassesパターン

状態に応じてスタイルを切り替えるためのパターンです。

```csharp
// src/Avalonia.Controls/Button.cs:35-39
[PseudoClasses(pcFlyoutOpen, pcPressed)]
public class Button : ContentControl, ICommandSource, IClickableControl
{
    private const string pcPressed = ":pressed";
    private const string pcFlyoutOpen = ":flyout-open";
```

---

## 3. 命名規則

> このセクションでは、プロジェクト全体で使用される命名規則を解説します。

### 3.1 ファイル・ディレクトリ命名

| パターン | 意味 | 例 |
|---------|------|-----|
| `Avalonia.{Module}` | モジュール別プロジェクト | `Avalonia.Base`, `Avalonia.Controls` |
| `{ControlName}.cs` | コントロール実装 | `Button.cs`, `TextBox.cs` |
| `{ControlName}.axaml` | XAMLテンプレート | `Button.axaml` |
| `I{InterfaceName}.cs` | インターフェース | `ICommand.cs` |
| `{Name}Impl.cs` | 実装クラス | `GeometryImpl.cs` |

### 3.2 クラス・関数・変数命名

| プレフィックス/サフィックス | 意味 | 例 |
|---------------------------|------|-----|
| `Property` | AvaloniaPropertyの定義 | `ClickModeProperty` |
| `Event` | RoutedEventの定義 | `ClickEvent` |
| `_` | privateフィールド | `_isPressed` |
| `On{EventName}` | イベントハンドラ | `OnClick` |
| `pc` | PseudoClass定数 | `pcPressed` |
| `I{Name}` | インターフェース | `ICommandSource` |
| `{Name}Args` | イベント引数 | `RoutedEventArgs` |

### 3.3 プログラム分類一覧

| 分類 | 説明 | ディレクトリ |
|------|------|-------------|
| Core | 基盤機能 | `src/Avalonia.Base` |
| Controls | UIコントロール | `src/Avalonia.Controls` |
| Primitives | 基本部品 | `src/Avalonia.Controls/Primitives` |
| Markup | XAML処理 | `src/Markup/` |
| Platform | プラットフォーム固有 | `src/Windows/`, `src/Avalonia.X11/`, etc. |
| Rendering | レンダリング | `src/Skia/` |
| Tools | 開発ツール | `src/tools/` |

---

## 4. ディレクトリ構造

> このセクションでは、プロジェクトのディレクトリ構造を解説します。

```
Avalonia-master/
├── src/                          # ソースコード
│   ├── Avalonia.Base/            # コアライブラリ
│   ├── Avalonia.Controls/        # UIコントロール
│   ├── Avalonia.Controls.ColorPicker/  # カラーピッカー
│   ├── Avalonia.Desktop/         # デスクトップ統合
│   ├── Avalonia.Dialogs/         # ダイアログ
│   ├── Avalonia.Fonts.Inter/     # Interフォント
│   ├── Avalonia.FreeDesktop/     # Linux/FreeDesktop統合
│   ├── Avalonia.Native/          # macOSネイティブ
│   ├── Avalonia.OpenGL/          # OpenGLサポート
│   ├── Avalonia.Themes.Fluent/   # Fluentテーマ
│   ├── Avalonia.Themes.Simple/   # シンプルテーマ
│   ├── Avalonia.X11/             # X11サポート
│   ├── Avalonia.Vulkan/          # Vulkanサポート
│   ├── Android/                  # Androidサポート
│   ├── Browser/                  # WebAssemblyサポート
│   ├── Headless/                 # ヘッドレスモード
│   ├── iOS/                      # iOSサポート
│   ├── Linux/                    # Linuxフレームバッファ
│   ├── Markup/                   # XAMLマークアップ
│   ├── Skia/                     # Skiaレンダリング
│   ├── Windows/                  # Windowsサポート
│   └── tools/                    # 開発ツール
├── samples/                      # サンプルアプリケーション
│   ├── ControlCatalog/           # コントロールカタログ
│   ├── ControlCatalog.Desktop/   # デスクトップ版
│   └── ...                       # その他サンプル
├── tests/                        # テストコード
│   ├── Avalonia.Base.UnitTests/  # 単体テスト
│   ├── Avalonia.Benchmarks/      # ベンチマーク
│   └── ...                       # その他テスト
├── packages/                     # NuGetパッケージ定義
├── nukebuild/                    # ビルドスクリプト
├── native/                       # ネイティブコード（macOS）
└── docs/                         # ドキュメント
```

### 各ディレクトリの役割

| ディレクトリ | 役割 | 主要ファイル |
|-------------|------|-------------|
| `src/Avalonia.Base` | コアクラス、プロパティシステム | `AvaloniaObject.cs`, `Visual.cs` |
| `src/Avalonia.Controls` | UIコントロール | `Button.cs`, `TextBox.cs`, `Window.cs` |
| `src/Avalonia.Controls/Primitives` | 基本部品 | `TemplatedControl.cs`, `Popup.cs` |
| `src/Markup/Avalonia.Markup.Xaml` | XAMLローダー | `AvaloniaXamlLoader.cs` |
| `src/Skia/Avalonia.Skia` | Skiaレンダリング | `DrawingContextImpl.cs` |
| `samples/ControlCatalog` | コントロールデモ | 各コントロールのサンプル |
| `tests/` | テストコード | 各モジュールのテスト |

---

## 5. アーキテクチャ

> このセクションでは、プロジェクトのアーキテクチャパターンを解説します。

### 5.1 全体アーキテクチャ

Avaloniaは階層化されたアーキテクチャを採用しており、プラットフォーム抽象化を通じてクロスプラットフォームを実現しています。

```mermaid
graph TB
    subgraph Application Layer
        App[Application]
        Window[Window/View]
        Controls[Controls]
    end

    subgraph Framework Layer
        Base[Avalonia.Base]
        ControlsLib[Avalonia.Controls]
        Markup[Avalonia.Markup.Xaml]
    end

    subgraph Rendering Layer
        Skia[Avalonia.Skia]
        OpenGL[Avalonia.OpenGL]
        Vulkan[Avalonia.Vulkan]
    end

    subgraph Platform Layer
        Win32[Avalonia.Win32]
        X11[Avalonia.X11]
        Native[Avalonia.Native]
        Android[Avalonia.Android]
        iOS[Avalonia.iOS]
        Browser[Avalonia.Browser]
    end

    App --> Window
    Window --> Controls
    Controls --> ControlsLib
    ControlsLib --> Base
    Markup --> Base
    Base --> Skia
    Skia --> Win32
    Skia --> X11
    Skia --> Native
    Skia --> Android
    Skia --> iOS
    Skia --> Browser
```

### 5.2 レイヤー構成

| レイヤー | 責務 | 代表的なファイル |
|---------|------|-----------------|
| Application | ユーザーアプリケーション | `App.axaml.cs`, `MainWindow.axaml.cs` |
| Controls | UIコンポーネント | `src/Avalonia.Controls/*.cs` |
| Base | コアフレームワーク | `src/Avalonia.Base/*.cs` |
| Rendering | 描画エンジン | `src/Skia/Avalonia.Skia/*.cs` |
| Platform | OS固有実装 | `src/Windows/`, `src/Avalonia.X11/` |

### 5.3 データフロー

1. **入力イベント**: プラットフォーム層で入力を受け取り、`InputManager`を通じてルーテッドイベントとして伝播
2. **プロパティ変更**: `AvaloniaProperty`システムによる変更通知と値の伝播
3. **レイアウト**: `Measure`/`Arrange`パスによるレイアウト計算
4. **レンダリング**: コンポジションシステムを通じたSkiaによる描画

---

## 6. 主要コンポーネント

> このセクションでは、主要なコンポーネントとその連携を解説します。

### 6.1 エントリーポイント

デスクトップアプリケーションのエントリーポイントは`Program.cs`です。

```csharp
// samples/ControlCatalog.Desktop/Program.cs:22-26
static class Program
{
    [STAThread]
    static int Main(string[] args)
    {
        var builder = BuildAvaloniaApp();
        // ...
        return builder.StartWithClassicDesktopLifetime(args);
    }
}
```

AppBuilderパターンでアプリケーションを構成します。

```csharp
// samples/ControlCatalog.Desktop/Program.cs:142-165
public static AppBuilder BuildAvaloniaApp()
    => AppBuilder.Configure<App>()
        .UsePlatformDetect()
        .With(new X11PlatformOptions
        {
            EnableMultiTouch = true,
            UseDBusMenu = true,
            EnableIme = true,
        })
        .UseSkia()
        .WithInterFont()
        .WithDeveloperTools();
```

### 6.2 ビジネスロジック

Avaloniaはフレームワークであるため、ビジネスロジックは利用者が実装します。フレームワークとしては以下の主要機能を提供：

- **プロパティシステム** (`AvaloniaObject`)
- **スタイルシステム** (`StyledElement`)
- **レイアウトシステム** (`Layoutable`)
- **入力システム** (`InputElement`)
- **レンダリングシステム** (`Visual`)

### 6.3 データアクセス

Avaloniaはデータバインディングシステムを提供します。

```csharp
// src/Avalonia.Markup/Data/Binding.cs（概念的な使用例）
// XAMLでの使用:
// <TextBox Text="{Binding UserName}" />

// コードでの使用:
textBox.Bind(TextBox.TextProperty, new Binding("UserName"));
```

### 6.4 ユーティリティ/共通機能

```csharp
// src/Avalonia.Base/Utilities/ThrowHelper.cs（ユーティリティ例）
// 引数検証用のヘルパー
ThrowHelper.ThrowIfNull(property, nameof(property));
```

---

## 7. よく使われるパターン

> このセクションでは、コード内で頻出するパターンを解説します。

### パターン一覧

| パターン | 説明 | 出現頻度 | 代表的なファイル |
|---------|------|---------|-----------------|
| AvaloniaProperty登録 | プロパティの定義 | 高 | 全コントロール |
| RoutedEvent登録 | イベントの定義 | 高 | `Button.cs`, `Control.cs` |
| OnPropertyChanged | プロパティ変更ハンドリング | 高 | 全コントロール |
| SetAndRaise | DirectProperty更新 | 中 | `Button.cs` |
| PseudoClasses | 状態管理 | 中 | `Button.cs`, `ToggleButton.cs` |
| TemplateApplied | テンプレート適用 | 中 | `TemplatedControl`派生 |

### 各パターンの詳細

#### パターン1: AvaloniaProperty登録

**目的:** リアクティブなプロパティシステムを実現し、データバインディング、スタイル、アニメーションを可能にする

**実装例:**
```csharp
// src/Avalonia.Controls/Button.cs:46-47
public static readonly StyledProperty<ClickMode> ClickModeProperty =
    AvaloniaProperty.Register<Button, ClickMode>(nameof(ClickMode));

// プロパティアクセサ
public ClickMode ClickMode
{
    get => GetValue(ClickModeProperty);
    set => SetValue(ClickModeProperty, value);
}
```

**解説:** `AvaloniaProperty.Register`でプロパティを登録し、`GetValue`/`SetValue`でアクセスします。

#### パターン2: RoutedEvent登録

**目的:** イベントをビジュアルツリー上で伝播させる

**実装例:**
```csharp
// src/Avalonia.Controls/Button.cs:82-83
public static readonly RoutedEvent<RoutedEventArgs> ClickEvent =
    RoutedEvent.Register<Button, RoutedEventArgs>(nameof(Click), RoutingStrategies.Bubble);

// イベントアクセサ
public event EventHandler<RoutedEventArgs>? Click
{
    add => AddHandler(ClickEvent, value);
    remove => RemoveHandler(ClickEvent, value);
}
```

#### パターン3: SetAndRaise（DirectProperty更新）

**目的:** DirectPropertyのバッキングフィールドを更新し、変更通知を発行する

**実装例:**
```csharp
// src/Avalonia.Controls/Button.cs:186-189
private bool _isPressed = false;

public bool IsPressed
{
    get => _isPressed;
    private set => SetAndRaise(IsPressedProperty, ref _isPressed, value);
}
```

---

## 8. 業務フロー追跡の実践例

> このセクションでは、実際の業務フローをコードで追跡する方法を解説します。

### 8.1 フロー追跡の基本手順

1. エントリーポイントを特定
2. 処理の流れを追跡（呼び出し関係を追う）
3. データの変換を確認
4. 最終的な出力を確認

### 8.2 フロー追跡の実例

#### 例1: ボタンクリックイベントの処理フロー

**概要:** ユーザーがボタンをクリックした際の処理の流れ

**処理フロー:**
```
PointerPressed → OnPointerPressed → IsPressed=true →
PointerReleased → OnPointerReleased → OnClick → ClickEvent発火 → Command実行
```

**詳細な追跡:**

1. **ポインター押下** (`src/Avalonia.Controls/Button.cs:403-427`)
   ```csharp
   protected override void OnPointerPressed(PointerPressedEventArgs e)
   {
       base.OnPointerPressed(e);

       if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)
       {
           // ...
           IsPressed = true;
           e.Handled = true;

           if (ClickMode == ClickMode.Press)
           {
               OnClick();
           }
       }
   }
   ```

2. **ポインター解放** (`src/Avalonia.Controls/Button.cs:430-445`)
   ```csharp
   protected override void OnPointerReleased(PointerReleasedEventArgs e)
   {
       base.OnPointerReleased(e);

       if (IsPressed && e.InitialPressMouseButton == MouseButton.Left)
       {
           IsPressed = false;
           e.Handled = true;

           if (ClickMode == ClickMode.Release &&
               this.GetVisualsAt(e.GetPosition(this)).Any(c => this == c || this.IsVisualAncestorOf(c)))
           {
               OnClick();
           }
       }
   }
   ```

3. **クリック処理** (`src/Avalonia.Controls/Button.cs:345-368`)
   ```csharp
   protected virtual void OnClick()
   {
       if (IsEffectivelyEnabled)
       {
           if (_isFlyoutOpen)
           {
               CloseFlyout();
           }
           else
           {
               OpenFlyout();
           }

           var e = new RoutedEventArgs(ClickEvent);
           RaiseEvent(e);

           (var command, var parameter) = (Command, CommandParameter);
           if (!e.Handled && command is not null && command.CanExecute(parameter))
           {
               command.Execute(parameter);
               e.Handled = true;
           }
       }
   }
   ```

### 8.3 フロー追跡チェックリスト

- [ ] エントリーポイントを特定したか
- [ ] 呼び出し関係を把握したか
- [ ] データの変換ポイントを確認したか
- [ ] エラーハンドリングを確認したか
- [ ] 最終的な出力を確認したか

---

## 9. 設計書の参照順序

> このセクションでは、プロジェクト理解のための設計書参照順序を案内します。

### 9.1 目的別ロードマップ

#### 全体像を把握したい場合
1. `README.md` - プロジェクト概要
2. `docs/build.md` - ビルド手順
3. `src/Avalonia.Base/` - コアコンセプト
4. `samples/ControlCatalog/` - 動作サンプル

#### 特定コントロールを理解したい場合
1. `src/Avalonia.Controls/{ControlName}.cs` - コントロール実装
2. `src/Avalonia.Themes.Fluent/Controls/{ControlName}.xaml` - デフォルトスタイル
3. `tests/Avalonia.Controls.UnitTests/` - テストコード
4. `samples/ControlCatalog/Pages/` - 使用例

#### プラットフォーム固有機能を理解したい場合
1. `src/Windows/Avalonia.Win32/` - Windows実装
2. `src/Avalonia.X11/` - Linux/X11実装
3. `src/Avalonia.Native/` - macOS実装
4. `native/Avalonia.Native/` - ネイティブコード

#### 改修作業を行う場合
1. 対象コントロールの実装ファイル
2. 関連するテストファイル
3. 関連するテーマファイル
4. `CONTRIBUTING.md` - 貢献ガイドライン

### 9.2 ドキュメント一覧

| ドキュメント | 概要 | 参照タイミング |
|-------------|------|---------------|
| `README.md` | プロジェクト概要 | 最初に |
| `CONTRIBUTING.md` | 貢献ガイドライン | PR作成前 |
| `docs/build.md` | ビルド手順 | 開発環境構築時 |
| `docs/api-compat.md` | API互換性 | 破壊的変更確認時 |
| `docs/release.md` | リリース手順 | リリース時 |
| 公式ドキュメント | https://docs.avaloniaui.net | 常時参照 |

---

## 10. トラブルシューティング

> このセクションでは、コードリーディング時によくある問題と解決法を解説します。

### よくある疑問と回答

#### Q: StyledPropertyとDirectPropertyの違いは？
A: `StyledProperty`はスタイル、アニメーション、継承をサポートする汎用プロパティです。`DirectProperty`はバッキングフィールドを直接持つ高速なプロパティで、読み取り専用やデータバリデーションに適しています。

#### Q: VisualTreeとLogicalTreeの違いは？
A: `LogicalTree`はコンテンツ構造（Button内のTextなど）を表し、`VisualTree`はレンダリング構造（テンプレート展開後のBorder, ContentPresenterなど）を表します。

#### Q: OnApplyTemplateはいつ呼ばれる？
A: `TemplatedControl`のテンプレートが適用された直後に呼ばれます。テンプレート内の要素を取得するのに使用します。

#### Q: PseudoClassesはどう使う？
A: `:pressed`, `:hover`などの状態をCSSライクに管理します。`PseudoClasses.Set(":pressed", true)`で設定します。

### デバッグのヒント

1. **DevTools**: `WithDeveloperTools()`でF12キーによる開発者ツールを有効化
2. **ロギング**: `LogToTrace()`でログ出力を有効化
3. **ビジュアルツリー確認**: DevToolsのLogical/Visual Treeビューを使用
4. **プロパティ確認**: DevToolsのPropertiesパネルでプロパティ値を確認
5. **スタイル確認**: DevToolsのStylesパネルで適用されているスタイルを確認

---

## 付録

### A. 用語集

| 用語 | 説明 |
|-----|------|
| AvaloniaProperty | Avaloniaのリアクティブプロパティシステム |
| StyledProperty | スタイル可能なプロパティ |
| DirectProperty | 直接バッキングフィールドを持つプロパティ |
| AttachedProperty | 他のオブジェクトに添付できるプロパティ |
| RoutedEvent | ビジュアルツリーを伝播するイベント |
| ControlTemplate | コントロールの外観を定義するテンプレート |
| DataTemplate | データオブジェクトの表示方法を定義するテンプレート |
| Style | コントロールの外観を定義するスタイル |
| ControlTheme | コントロール固有のテーマ定義 |
| PseudoClass | 状態に基づくスタイル適用のための擬似クラス |
| Lookless Control | 外観がテンプレートで定義されるコントロール |
| Visual Tree | レンダリング構造を表すツリー |
| Logical Tree | コンテンツ構造を表すツリー |

### B. ファイル一覧

| ファイル/ディレクトリ | 説明 | 主な内容 |
|---------------------|------|---------|
| `src/Avalonia.Base/AvaloniaObject.cs` | プロパティシステムの基底クラス | プロパティ管理、変更通知 |
| `src/Avalonia.Base/StyledElement.cs` | スタイル対応要素 | スタイル適用、リソース管理 |
| `src/Avalonia.Base/Visual.cs` | ビジュアル要素 | レンダリング、変換 |
| `src/Avalonia.Controls/Control.cs` | コントロール基底クラス | フォーカス、コンテキストメニュー |
| `src/Avalonia.Controls/Primitives/TemplatedControl.cs` | テンプレート対応コントロール | テンプレート適用 |
| `src/Avalonia.Controls/Button.cs` | ボタンコントロール | クリック、コマンド |
| `src/Avalonia.Controls/Window.cs` | ウィンドウ | トップレベルコンテナ |

### C. 参考資料

- [Avalonia公式ドキュメント](https://docs.avaloniaui.net)
- [Avalonia GitHubリポジトリ](https://github.com/AvaloniaUI/Avalonia)
- [C#言語リファレンス](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/)
- [.NET APIリファレンス](https://docs.microsoft.com/ja-jp/dotnet/api/)
- [WPFドキュメント](https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/) - Avaloniaの設計思想理解に有用
