🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

2784閲覧

DrawingContextのDrawLineで破線がうまく描けない

Y...M

総合スコア18

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2021/03/30 02:59

前提・実現したいこと

DrawLineで線幅を変更したときに破線間隔を維持して描きたかったので、
以下のようにしたのですが、2dot以降破線になりません。

LineクラスをXamlで描いたときはうまくいくのですが、
同じようにDrawLineで描くことはできないでしょうか。

該当のソースコード

C#

1 public void DrawLines(DrawingContext dc, IEnumerable<System.Windows.Point> points, double thickness, System.Windows.Media.Color color, DashStyle dashStyle) 2 { 3 4 var myPen1 = new System.Windows.Media.Pen 5 { 6 Thickness = thickness, 7 Brush = new SolidColorBrush(color), 8 DashStyle = GetDashStyle(dashStyle, thickness) 9 }; 10 var col = myPen1.DashStyle.Dashes; 11 myPen1.Freeze(); 12 13 14 var tuplepoints = new List<(System.Windows.Point, System.Windows.Point)>(); 15 System.Windows.Point? temppoint = null; 16 17 foreach (var point in points) 18 { 19 if (temppoint is System.Windows.Point pt) 20 { 21 tuplepoints.Add((pt, point)); 22 } 23 temppoint = point; 24 } 25 foreach (var pair in tuplepoints) 26 { 27 dc.DrawLine(myPen1, pair.Item1, pair.Item2); 28 } 29 } 30 31 private System.Windows.Media.DashStyle GetDashStyle(DashStyle dashStyle, double thickness) 32 { 33 return dashStyle switch 34 { 35 DashStyle.Solid => DashStyles.Solid, 36 DashStyle.Dot => new System.Windows.Media.DashStyle() 37 { 38 Dashes = new DoubleCollection(new double[] { 2 / thickness , 2 / thickness }), 39 }, 40 DashStyle.Dash => new System.Windows.Media.DashStyle() 41 { 42 Dashes = new DoubleCollection(new double[] { 4 / thickness, 4/ thickness }) 43 }, 44 DashStyle.DashDot => new System.Windows.Media.DashStyle() 45 { 46 Dashes = new DoubleCollection(new double[] { 12 / thickness, 8 / thickness, 4 / thickness, 8 / thickness }), 47 Offset = 6 48 }, 49 DashStyle.DashDotDot => new System.Windows.Media.DashStyle() 50 { 51 Dashes = new DoubleCollection(new double[] { 12 / thickness, 4 / thickness, 4 / thickness, 4 / thickness, 4 / thickness, 4 / thickness }), 52 Offset = 6 53 }, 54 _ => throw new Exception("破線スタイルがありません") 55 }; 56 }

Xaml

1 <Canvas Grid.Column="1" Background="Black"> 2 <Line Canvas.Left="50" Canvas.Top="150" X1="0" Y1="0" X2="300" Y2="0" Stroke="Yellow" StrokeDashArray="2,2" StrokeThickness="1"/> 3 <Line Canvas.Left="50" Canvas.Top="170" X1="0" Y1="0" X2="300" Y2="0" Stroke="Yellow" StrokeDashArray="0.5,0.5" StrokeThickness="4"/> 4 <Line Canvas.Left="50" Canvas.Top="190" X1="0" Y1="0" X2="300" Y2="0" Stroke="Yellow" 5 </Canvas>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

DrawingContext自体を使ったことがないので、的外れかもしれませんが、
GetDashStyle のメソッドが変ではないでしょうか?もしかして、System.Drawing.Drawing2D.DashStyle 列挙型を使用していますか?

私の環境では以下のコードで描けました。

csharp

1 /// <summary> 2 /// Interaction logic for MainWindow.xaml 3 /// </summary> 4 public partial class MainWindow : Window 5 { 6 public MainWindow() 7 { 8 InitializeComponent(); 9 this.Content = new MyElment(); 10 } 11 } 12 13 class MyElment : FrameworkElement 14 { 15 protected override void OnRender(DrawingContext dc) 16 { 17 base.OnRender(dc); 18 19 var pt1 = new Point(10, 10); 20 var pt2 = new Point(200, 100); 21 var pt3 = new Point(50, 150); 22 23 DrawLines(dc, new[] { pt1, pt2, pt3 }, 5, Colors.Red, new DashStyle(new[] { 1d, 2d }, 0)); 24 } 25 26 public void DrawLines(DrawingContext dc, IEnumerable<System.Windows.Point> points, double thickness, System.Windows.Media.Color color, DashStyle dashStyle) 27 { 28 29 var myPen1 = new System.Windows.Media.Pen 30 { 31 Thickness = thickness, 32 Brush = new SolidColorBrush(color), 33 //DashStyle = GetDashStyle(dashStyle, thickness) 34 DashStyle = dashStyle 35 }; 36 var col = myPen1.DashStyle.Dashes; 37 myPen1.Freeze(); 38 39 40 var tuplepoints = new List<(System.Windows.Point, System.Windows.Point)>(); 41 System.Windows.Point? temppoint = null; 42 43 foreach (var point in points) 44 { 45 if (temppoint is System.Windows.Point pt) 46 { 47 tuplepoints.Add((pt, point)); 48 } 49 temppoint = point; 50 } 51 foreach (var pair in tuplepoints) 52 { 53 dc.DrawLine(myPen1, pair.Item1, pair.Item2); 54 } 55 } 56 } 57

イメージ説明

投稿2021/04/01 11:26

soi013

総合スコア149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問