wpf画箭头

下面是画arrow的类

 

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 Tomers.WPF.Shapes
{
 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
 }
}

下面是一个使用实例

  public MainWindow()
        {
            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);

        }


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值