前提・実現したいこと
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>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。