1, ZC: I (20,190,717) found in a 2-way draw the arrow: (1) drawn System.Windows.Controls.Canvas in; (2) to draw on Graphics
2, plotted in System.Windows.Controls.Canvas
2.1, use WPF to create a drawing arrows - NET Road Ahead - blog Park .html ( https://www.cnblogs.com/lonelyxmas/p/9844910.html )
ZC: This article is not available in the complete code, the corresponding code found in the following article, the buckle out
WPF painted arrow - Baidu library .html ( https://wenku.baidu.com/view/cc13b2edaeaad1f346933fc6.html )
2.2, class code:
using System; using System.ComponentModel; using System.Windows; using System.Windows.Media; using System.Windows.Input; using System.Windows.Controls; using System.Windows.Shapes; namespace xxxxx.ShapeSHH { public sealed class Arrow : Shape { #region Dependency Properties public static readonly DependencyProperty X1Property = DependencyProperty.Register("X1", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure)); public static readonly DependencyProperty Y1Property = DependencyProperty.Register("Y1", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure)); public static readonly DependencyProperty X2Property = DependencyProperty.Register("X2", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure)); public static readonly DependencyProperty Y2Property = DependencyProperty.Register("Y2", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure)); public static readonly DependencyProperty HeadWidthProperty = DependencyProperty.Register("HeadWidth", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure)); public static readonly DependencyProperty HeadHeightProperty = DependencyProperty.Register("HeadHeight", typeof(double), typeof(Arrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure)); #endregion #region CLR Properties [TypeConverter(typeof(LengthConverter))] public double X1 { get { return (double)base.GetValue(X1Property); } set { base.SetValue(X1Property, value); } } [TypeConverter(typeof(LengthConverter))] public double Y1 { get { return (double)base.GetValue(Y1Property); } set { base.SetValue(Y1Property, value); } } [TypeConverter(typeof(LengthConverter))] public double X2 { get { return (double)base.GetValue(X2Property); } set { base.SetValue(X2Property, value); } } [TypeConverter(typeof(LengthConverter))] public double Y2 { get { return (double)base.GetValue(Y2Property); } set { base.SetValue(Y2Property, value); } } [TypeConverter(typeof(LengthConverter))] public double HeadWidth { get { return (double)base.GetValue(HeadWidthProperty); } set { base.SetValue(HeadWidthProperty, value); } } [TypeConverter(typeof(LengthConverter))] public double HeadHeight { get { return (double)base.GetValue(HeadHeightProperty); } set { base.SetValue(HeadHeightProperty, value); } } #endregion #region Overrides protected override Geometry DefiningGeometry { get { // Create a StreamGeometry for describing the shape StreamGeometry geometry = new StreamGeometry(); geometry.FillRule = FillRule.EvenOdd; using (StreamGeometryContext context = geometry.Open()) { InternalDrawArrowGeometry(context); } // Freeze the geometry for performance benefits geometry.Freeze(); return geometry; } } #endregion #region Privates private void InternalDrawArrowGeometry(StreamGeometryContext context) { double theta = Math.Atan2(Y1 - Y2, X1 - X2); double sint = Math.Sin(theta); double cost = Math.Cos(theta); Point pt1 = new Point(X1, this.Y1); Point pt2 = new Point(X2, this.Y2); Point pt3 = new Point( X2 + (HeadWidth * cost - HeadHeight * sint), Y2 + (HeadWidth * sint + HeadHeight * cost)); Point pt4 = new Point( X2 + (HeadWidth * cost + HeadHeight * sint), Y2 - (HeadHeight * cost - HeadWidth * sint)); context.BeginFigure(pt1, true, false); context.LineTo(pt2, true, true); context.LineTo(pt3, true, true); context.LineTo(pt2, true, true); context.LineTo(pt4, true, true); } #endregion } }
2.3, call code:
(1)
private void DrawLeaderLineArrow(Point startPt, Point endPt) { Arrow arrow = new Arrow(); arrow.X1 = startPt.X; arrow.Y1 = startPt.Y; arrow.X2 = endPt.X; arrow.Y2 = endPt.Y; arrow.HeadWidth = 15; arrow.HeadHeight = 5; arrow.Stroke = Brushes.Black; arrow.StrokeThickness = 1; _canvas.Children.Add(arrow); }
(2)
private void DrawLeaderLineArrow(Point startPt, Point endPt) {
InitializeComponent();
Arrow arrow = new Arrow(); arrow.X1 = 50; arrow.Y1 = 50; arrow.X2 = 100; arrow.Y2 = 100; arrow.HeadWidth = 15; arrow.HeadHeight = 5; arrow.Stroke = Brushes.Black; arrow.StrokeThickness = 1; canvas.Children.Add(arrow); }
3, drawn on Graphics
3.1, C # arrow painting - lonely cat - blog Park .html ( https://www.cnblogs.com/djcsch2001/archive/2011/05/07/2039991.html )
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias; g.FillRectangle(Brushes.White, this.ClientRectangle); Pen p = new Pen(Color.Black, 10); p.StartCap = LineCap.Round; p.EndCap = LineCap.ArrowAnchor; g.DrawLine(p, 30, 30, 80, 30); p.Dispose(); }
3.2, C # Development Tutorial - How to Draw an arrow - David.Wang do something you love - CSDN blog .html ( https://blog.csdn.net/wanglixin1999/article/details/41183305 )
Graphics g = e.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias; g.FillRectangle(Brushes.White, this.ClientRectangle); Pen p = new Pen(Color.Black, 10); p.StartCap = LineCap.Round; p.EndCap = LineCap.ArrowAnchor; g.DrawLine(p, 30, 30, 80, 30); p.Dispose();
4, WPF draw arrows - waiting - CSDN blog .html ( https://blog.csdn.net/u012366767/article/details/84857000 )
ZC: This article looks very fast hardware, did not look do not know what principle, under the first record ...
5、