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

InkCanvas Graphics

InkCanvas はスタイラスやマウスでデジタルインクを描画できるコントロールです。フリーハンド描画、選択、消去モードをサポートし、ストロークをインクデータとして保存・読み込みできます。

概要

WPF の InkCanvasFrameworkElement を継承したデジタルインク描画コントロールです。タブレットペン(スタイラス)やマウスでフリーハンド描画が可能で、描画されたストロークは Strokes プロパティに StrokeCollection として保持されます。

EditingMode プロパティで現在の操作モードを切り替えます。Ink モードでは描画、Select モードではストロークの選択・移動、EraseByPointEraseByStroke では消去ができます。ツールバーのボタンとバインドしてモードを切り替えるのが一般的です。

DefaultDrawingAttributes でペンの色・太さ・筆圧特性などを設定します。DrawingAttributes クラスには Color、Width、Height、StylusTip(円形か四角形か)、IsHighlighter(ハイライターモード)などのプロパティがあります。

ストロークの保存・読み込みには InkSerializer を使用します。ISF(Ink Serialized Format)形式でストリームに書き出すか、PNG 形式でレンダリングして保存できます。

画面キャプチャ

inkcanvas demo screen

デモしているプロパティ

以下のプロパティが WPF 標準コントロールデモアプリでインタラクティブにデモされています。

プロパティ設定値説明
EditingModeNone/Ink/GestureOnly/InkAndGesture/Select/EraseByPoint/EraseByStroke現在の編集モードを設定します。Select モードはストロークの選択・移動・変形に使い、GestureOnly は円を描くと削除するなどジェスチャー認識専用として使います。Ink は通常の描画モードです。モードを切り替えることでツールバーに応じた操作を提供できます。はまりやすいポイント:EditingMode=None はすべての入力をブロックします。一時的に描画を無効にしたい場合(読み取り専用表示など)に使えますが、EditingMode はマウス入力のモードを制御し、タブレットペン入力は ActiveEditingMode が使われる点に注意してください。
ActiveEditingMode (ReadOnly)InkCanvasEditingModeスタイラスの現在のアクティブな編集モードを示す読み取り専用プロパティです。ステータスバーやツールバーインジケーターに現在のモードを表示したい場合にこのプロパティをバインドして参照します。プロパティ変更通知(PropertyChanged)を購読することで UI をリアルタイムに更新できます。はまりやすいポイント:このプロパティは読み取り専用のため設定できません。モードを変更する際は EditingMode プロパティを使用してください。
EditingModeInvertedInkCanvasEditingModeスタイラスを反転した側(物理的な消しゴム側)で使う場合の操作モードを設定します。タブレットペンには消しゴム側が付いており、ペンをひっくり返して使った時のモードをここで定義します(通常は EraseByStroke を設定)。はまりやすいポイント:マウスのみの環境では EditingModeInverted は効果がありません。タブレットが接続されていない場合にこの機能に依存したワークフローを作ると、マウスユーザーは消しゴム側の機能を使えなくなります。
DefaultDrawingAttributesDrawingAttributesペンの色・太さ・スタイルなどの描画属性を設定します。描画途中で色を変えたい場合は新しい DrawingAttributes インスタンスを作成して DefaultDrawingAttributes に代入します。IsHighlighter=true にすると半透明のハイライター描画になります。はまりやすいポイント:DefaultDrawingAttributes の変更は新しく描くストロークにのみ適用されます。既存のストローク(Strokes コレクション内のもの)には反映されないため、過去の描画色を変えたい場合は各ストロークの DrawingAttributes を個別に変更する必要があります。
StrokesStrokeCollection描画されたすべてのインクストロークのコレクションです。プログラムからストロークを追加・削除したり、保存・読み込みに使用します。保存する際は StrokeCollection.Save(stream) で ISF(Ink Serialized Format)形式でストリームに書き出し、読み込みは new StrokeCollection(stream) で行います。はまりやすいポイント:Strokes コレクションからストロークを削除してもアンドゥ機能は提供されません。アンドゥ/リドゥが必要な場合は削除したストロークのスタックを自前で管理する実装が必要です。
BackgroundBrushInkCanvas の背景色を設定します。Background="White" にすると白い描画面として視覚的に分かりやすくなります。null(デフォルト)は透明で、下層の要素が透けて見えます。はまりやすいポイント:透明背景のままにするとストロークが「宙に浮いている」ように見え、描画エリアの境界が不明瞭になります。描画エリアをユーザーに認識させるには Background="White" の設定または外側に Border コントロールを配置することをお勧めします。

XAML 使用例

<InkCanvas x:Name="inkCanvas"
           EditingMode="{Binding CurrentMode}"
           Background="White">
  <InkCanvas.DefaultDrawingAttributes>
    <DrawingAttributes Color="Black" Width="3" Height="3"
                       StylusTip="Ellipse" />
  </InkCanvas.DefaultDrawingAttributes>
</InkCanvas>

<!-- モード切り替えボタン -->
<ToolBar>
  <RadioButton Content="描画" Tag="{x:Static InkCanvasEditingMode.Ink}"
               IsChecked="{Binding IsInkMode}" />
  <RadioButton Content="消去" Tag="{x:Static InkCanvasEditingMode.EraseByStroke}"
               IsChecked="{Binding IsEraseMode}" />
</ToolBar>

主な使用例

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

関連コントロール

ソースコード

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

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