動的に Path を簡単に描く方法

こんばんは、siokoshou です。オンラインの MSDN ライブラリは、左ペインを隠しておく(たんにグリップを左端にぴちっとくっつけとくだけ)と軽いような気がして精神衛生上良いと思います。

今日は WPF の Path まわりのお話。ふつう Path を描くにはマウスを使って Blend や Inkscape などのツールで描いて XAML を吐き出します。しかし、ユーザの操作に応じて動的に C# のコードで Path を描こうとするとちょっと面倒です。たいていはツールで XAML を吐き出しておいて、始点を変えたり、大きさを変えたりとか、その一部を書き換えるだけだと思います。これを簡単に行う方法を見つけたのでメモ。
XAML の Path はミニ言語になっていて、「F0 M10,100 L100,100 100,50Z」みたいに書けます。これを C# で描くには、MSDNこのへんを見ると、ミニ言語と全然違う形式でコードを書かないといけないかのような記述があって、じゃあライブラリでも書くかと書きかけてたんだけど、実はミニ言語を直接読み込む方法がありました。「Geometry.Parse( 文字列 );」とするだけ。これで path.Data につっこめる形式にパースしてくれました。

var path = new System.Windows.Shapes.Path();
path.Stroke = Brushes.Black;
path.StrokeThickness = 1;
path.Data = Geometry.Parse( 文字列 );

このようにするだけ。あとはツールが吐き出したミニ言語部分をコピペして、文字列の変更が必要な部分を書き換えるコードだけで済みます。XAML をパースできるわけじゃなくて、ミニ言語部分だけです。つまり「<Path Data="F0 M10,100 L100,100 100,50Z" StrokeThickness="1" Stroke="Black"/>」の中の Data の部分だけです。


本当はこんなエントリを書くつもりじゃなくて、今をときめくメソッドチェーン形式でこのミニ言語っぽいライブラリを書いたよ!って書こうとしてたんだけど、1/3くらい書いたところで、Geometry.Parse メソッドを見つけてしまったという(T-T)

path.Data = Path.StreamGeometry().M( 100, 100 ).h( 100 ).v( -50 ).Z();

こんな風に書けるところまではできてた…。まあ、メソッドチェーンはまたいつか…。ってか、やる気なくした。寝る。