[C# WPF] StreamGeometryで破線を描画する

2019年4月18日

StreamGeometryで破線の描画をしたくなったのですが、Penオブジェクトへの設定での破線描画を調べると、Drawing.Penを使用する場合の設定方法ばかり出てきたので、Media.Penを使用する場合のサンプルを残しておきます。

WPFには、Penオブジェクトが2種類あります。

  • System.Windows.Media.Pen
  • System.Drawing.Pen

それぞれ、破線を描画するためのDashStyleの設定方法が違います。
Geometryを使用する場合、DrawGeometry()へ指定できるのはWindows.Media.Penの方です。

スポンサーリンク

サンプルコード

StreamGeometryを使用して、UserControlのOnRender()で描画したサンプルです。
Xaml側には何もしていないので、ここには載せていません。

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace Sample_StreamGeometryDashStyle
{
    /// <summary>
    /// MyView.xaml の相互作用ロジック
    /// </summary>
    public partial class MyView : UserControl
    {
        public MyView()
        {
        }

        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);

            // 破線を描画するPenの生成
            Point pt = new Point();

            Pen pen = new Pen();
            pen.Brush = Brushes.Green;

            // DashStyleを設定する
            // 生成時の第一引数で破線の間隔を指定します
            DashStyle dashStyle = new DashStyle(new double[] { 7, 7 }, 0);
            pen.DashStyle = dashStyle;

            StreamGeometry geometry = new StreamGeometry();
            using (StreamGeometryContext context = geometry.Open())
            {
                pt.X = 0; pt.Y = 0;
                context.BeginFigure(pt, false, false);
                pt.X = ActualWidth; pt.Y = ActualHeight;
                context.LineTo(pt, true, true);
            }
            geometry.Freeze();
            drawingContext.DrawGeometry(null, pen, geometry);
        }
    }
}

第一引数の配列のひとつめが実線の長さ、ふたつめが空白の長さ、みっつめが実線の長さ、という感じに指定できます。
ここで指定した順番でループしながら破線が描画されます。

おしまい。

スポンサーリンク

C#,WPFC#,WPF

Posted by peliphilo