WPF 標準コントロールデモアプリ › Canvas

Canvas Graphics

Canvas は絶対位置指定を使用するレイアウトパネルです。子要素は Canvas の添付プロパティ(Top、Left、Right、Bottom)を使用して明示的な座標に配置されます。精密なコントロールが必要な描画アプリケーションやアニメーションに最適です。

概要

WPF の Canvas は絶対座標によるレイアウトを提供するパネルです。 GridStackPanel などが相対的・自動的なサイズ配置を行うのに対し、Canvas では各子要素の位置を ピクセル単位で明示的に指定します。これにより、精密な配置が必要な描画アプリやゲーム UI、カスタムダイアグラムに適しています。

子要素の配置は Canvas の添付プロパティ(Canvas.LeftCanvas.TopCanvas.RightCanvas.Bottom)を使用します。 LeftRightTopBottom は同時に使用できません。 設定されていない軸の位置はデフォルトで 0 になります。

Canvas は子要素の測定に無限大のサイズを与えるため、子要素は自然なサイズで描画されます。 Canvas 自体はデフォルトではコンテンツに合わせたサイズ計算を行わないため、 明示的に Width/Height を設定するか、親コンテナからサイズを受け取る必要があります。

アニメーションとの組み合わせも強力です。Canvas.LeftCanvas.Top にアニメーションを 適用することで、要素を画面上で滑らかに移動させるアニメーションを簡単に実装できます。

画面キャプチャ

canvas demo screen

デモしているプロパティ

以下のプロパティが WPF 標準コントロールデモアプリでインタラクティブにデモされています。 アプリ上でリアルタイムに各プロパティを変更してその動作を確認できます。

プロパティ設定値説明
Top / Left / Right / Bottom (Canvas attached) double 子要素の Canvas 内での位置を設定する添付プロパティです。Left=50, Top=30 と設定すると、Canvas の左端から 50px、上端から 30px の位置に配置されます。RightBottom は Canvas の右端・下端を基準にした配置(例えばウォーターマークや固定フッター要素を右下に固定)に使います。設定した結果、要素は指定した端からのオフセット位置に描画されます。はまりやすいポイント:LeftRight を同一要素に同時に設定しても要素はリサイズされません。要素は自然サイズのままで Left の値が優先されて位置が決まるため、両方設定しても「両端に合わせて伸縮する」とはなりません。
ZIndex (Panel attached) int 子要素の描画順序(Z 順)を制御します。選択ハンドルを内容の上に重ねたい場合やツールチップを他要素の上に表示したいなど、特定の要素を前面に出したい時に使用します。値が大きい要素は小さい要素の上に描画されます。はまりやすいポイント:すべての要素の ZIndex は既定値が 0 のため、明示的に設定しない場合は XAML 上で後に定義された要素(子コレクションで後の要素)が前面に来ます。この暗黙の順序に頼らず、重なりを制御したい要素には ZIndex を明示的に設定してください。

XAML 使用例

Canvas を使った絶対位置配置と Z 順の例です:

<Canvas Width="400" Height="300" Background="LightGray">
  <!-- 左上から 50px, 上から 30px に配置 -->
  <Rectangle Canvas.Left="50" Canvas.Top="30"
             Width="100" Height="60" Fill="Blue" />

  <!-- ZIndex で前面に表示 -->
  <Ellipse Canvas.Left="80" Canvas.Top="60"
           Width="80" Height="80" Fill="Red"
           Panel.ZIndex="1" />

  <!-- アニメーションで移動 -->
  <Button Content="移動" Canvas.Left="200" Canvas.Top="150">
    <Button.Triggers>
      <EventTrigger RoutedEvent="Button.Click">
        <BeginStoryboard>
          <Storyboard>
            <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)"
                             To="300" Duration="0:0:1" />
          </Storyboard>
        </BeginStoryboard>
      </EventTrigger>
    </Button.Triggers>
  </Button>
</Canvas>

主な使用例

ヒントとベストプラクティス

関連コントロール

ソースコード

このデモ画面のソースコードは GitHub で公開しています。アプリ内の「コード表示」ボタンから各プロパティの実際の XAML を確認できます。

GitHub で Canvas のソースコードを見る →