概要
WPF で Label を大量に配置した画面において、初期描画とスクロール時の応答が低下する事象を確認した。
本記事では、Label と TextBlock の構造差に基づいて原因を整理し、性能を優先する画面での実装方針を示す。
前提・対象環境
- フレームワーク/言語: .NET 8 / C# 12 / WPF
- 対象コントロール:
Label、TextBlock - アーキテクチャ: MVVM(コードビハインドでも同様)
- 想定画面: 一覧・ダッシュボードなどテキスト要素を多数表示する画面
問題
Label を数十個から数百個単位で配置した画面では、以下の問題が発生しやすい。
- 初期表示が遅くなる。
- リサイズやスクロール時の再描画が重くなる。
- 同じ文字列表示用途でも
TextBlock構成よりメモリ使用量が増える。
フォーム見出し向けに Label を使う実装をそのまま一覧表示へ展開すると、表示性能が劣化しやすい。
原因・背景
TextBlock はテキスト描画を主目的とする軽量な要素であり、FrameworkElement を直接継承する。
一方で Label は ContentControl を継承し、文字列以外のコンテンツも扱える汎用 UI 部品として設計されている。
Label は内部で ContentPresenter を介して描画を行い、必要に応じてアクセスキー処理や Target 連携などの機能を提供する。
このため、単純な文字表示だけを大量に行う用途では、TextBlock よりもオーバーヘッドが大きくなる。
解決方法
解決方針は、用途を「表示専用」か「入力連携付きラベル」かで分離することである。
- 表示専用テキスト: 原則
TextBlockを採用する。 - 入力フォーム見出し:
Targetやアクセスキーが必要な箇所のみLabelを使用する。 - 既存画面の改修:
Labelを一括で置換せず、要件を満たす範囲で段階的にTextBlock化する。
実装例
まず、単純表示用途の Label を TextBlock に置き換える例を示す。
この置き換えは、見た目を維持しつつ描画コストを削減する目的で実施する。
<!-- 置き換え前 -->
<Label Content="ステータス: 実行中" />
<!-- 置き換え後 -->
<TextBlock Text="ステータス: 実行中" />
この変更により、表示専用箇所から Label 固有機能を外し、軽量な描画構成に統一できる。
ただし Label の既定 Padding がなくなるため、必要に応じて Margin や Padding を明示する。
次に、Label が必要な入力フォーム見出しの例を示す。
このパターンでは操作性とアクセシビリティを維持するため、Label を継続利用する。
<StackPanel Orientation="Horizontal">
<Label Content="名前(_N):"
Target="{Binding ElementName=NameTextBox}"
VerticalAlignment="Center" />
<TextBox x:Name="NameTextBox" Width="180" />
</StackPanel>
Alt + N によるフォーカス移動と、ラベルクリック時のフォーカス移動を利用する要件では Label が適する。
このため、性能改善では「全面禁止」ではなく「要件ベースの使い分け」が必要となる。
注意点
LabelからTextBlockへ置き換えると、アクセスキー(_)とTargetによるフォーカス連携は失われる。- 長文表示では、
TextBlock側でTextWrapping="Wrap"やTextTrimmingを明示しないと意図した表示にならない場合がある。 - 既存 UI では
Label既定余白に依存していることがあるため、置き換え後の行間と整列を確認する必要がある。 DataGridやItemsControlのテンプレート内で多数描画する場合は、仮想化設定と併せて評価することが重要である。
代替案・比較
| 方法 | メリット | デメリット | 適するケース |
|---|---|---|---|
すべて Label のまま維持 |
アクセスキーや Target を既存仕様どおり保持できる |
大量表示時の描画コストが高い | 入力フォーム中心で要素数が少ない画面 |
表示専用箇所を TextBlock へ置換 |
描画とメモリ負荷を抑えやすい | 余白・折り返し設定の見直しが必要 | 一覧・監視画面などテキスト表示が多い画面 |
画面全体を TextBlock 化 |
単純化しやすく軽量 | Label 固有の操作性を失う |
入力連携が不要な読み取り専用画面 |
まとめ
WPF で Label を大量配置した場合の遅延要因は、ContentControl としての汎用機能に起因する描画オーバーヘッドである。
性能を優先する画面では、表示専用テキストを TextBlock に寄せる構成が有効である。
実装判断の基準は以下となる。
Targetとアクセスキーが必要な箇所はLabelを維持する。- 単純な文字表示は
TextBlockを採用する。 - 大量描画領域では、コントロール選択に加えて仮想化とレイアウトの再評価を実施する。
この基準により、操作性を維持しながら描画性能の劣化を抑制できる。