wpf自定义控件-单/双箭头线

这篇具有很好参考价值的文章主要介绍了wpf自定义控件-单/双箭头线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;

namespace CustomControls
{
[TypeDescriptionProvider(typeof(CustomTypeDescriptionProvider))]
public class CustomArrow : Shape
{
public CustomArrow ()
{
Stroke= new SolidColorBrush(Color.FromRgb(0, 140, 206));
}
#region Dependency Properties

    public static readonly DependencyProperty X1Property = DependencyProperty.Register("X1", typeof(double), typeof(BvArrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
    public static readonly DependencyProperty Y1Property = DependencyProperty.Register("Y1", typeof(double), typeof(BvArrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
    public static readonly DependencyProperty X2Property = DependencyProperty.Register("X2", typeof(double), typeof(BvArrow), new FrameworkPropertyMetadata(150.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
    public static readonly DependencyProperty Y2Property = DependencyProperty.Register("Y2", typeof(double), typeof(BvArrow), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
    public static readonly DependencyProperty HeadWidthProperty = DependencyProperty.Register("HeadWidth", typeof(double), typeof(BvArrow), new FrameworkPropertyMetadata(15.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
    public static readonly DependencyProperty HeadHeightProperty = DependencyProperty.Register("HeadHeight", typeof(double), typeof(BvArrow), new FrameworkPropertyMetadata(5.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
    public static readonly DependencyProperty IsBidirectionalProperty = DependencyProperty.Register("IsBidirectional", typeof(bool), typeof(BvArrow), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));

    #endregion

    #region CLR Properties
    [Browsable(true)]
    public bool IsBidirectional
    {
        get
        {
            return (bool)GetValue(IsBidirectionalProperty);
        }
        set
        {
            SetValue(IsBidirectionalProperty, value);
        }
    }

    [Browsable(true)]
    public new Brush Stroke
    {
        get 
        { 
            return (Brush)GetValue(StrokeProperty); 
        }
        set
        {
            SetValue(StrokeProperty, value);
        }
    }
    [Browsable(true)]
    [TypeConverter(typeof(LengthConverter))]
    public new double StrokeThickness
    {
        get
        {
            return (double)GetValue(StrokeThicknessProperty);
        }
        set
        {
            SetValue(StrokeThicknessProperty, value);
        }
    }

    [Browsable(true)]
    [TypeConverter(typeof(LengthConverter))]
    public double X1
    {
        get { return (double)base.GetValue(X1Property); }
        set { base.SetValue(X1Property, value); }
    }

    [Browsable(true)]
    [TypeConverter(typeof(LengthConverter))]
    public double Y1
    {
        get { return (double)base.GetValue(Y1Property); }
        set { base.SetValue(Y1Property, value); }
    }

    [Browsable(true)]
    [TypeConverter(typeof(LengthConverter))]
    public double X2
    {
        get { return (double)base.GetValue(X2Property); }
        set { base.SetValue(X2Property, value); }
    }

    [Browsable(true)]
    [TypeConverter(typeof(LengthConverter))]
    public double Y2
    {
        get { return (double)base.GetValue(Y2Property); }
        set { base.SetValue(Y2Property, value); }
    }

    [Browsable(true)]
    [TypeConverter(typeof(LengthConverter))]
    public double HeadWidth
    {
        get { return (double)base.GetValue(HeadWidthProperty); }
        set { base.SetValue(HeadWidthProperty, value); }
    }

    [Browsable(true)]
    [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);
        if(IsBidirectional)
        {
            Point pt3 = new Point(
             X1 - (HeadWidth * cost - HeadHeight * sint),
             Y1 - (HeadWidth * sint + HeadHeight * cost));

            Point pt4 = new Point(
                X1 - (HeadWidth * cost + HeadHeight * sint),
                Y1 + (HeadHeight * cost - HeadWidth * sint));

            Point pt5 = new Point(
            X2 + (HeadWidth * cost - HeadHeight * sint),
            Y2 + (HeadWidth * sint + HeadHeight * cost));

            Point pt6 = new Point(
                X2 + (HeadWidth * cost + HeadHeight * sint),
                Y2 - (HeadHeight * cost - HeadWidth * sint));

            context.BeginFigure(pt1, true, false);
            context.LineTo(pt3, true, true);
            context.LineTo(pt1, false, true);
            context.LineTo(pt4, false, true);
            context.LineTo(pt1, true, true);
            context.LineTo(pt2, true, true);
            context.LineTo(pt5, true, true);
            context.LineTo(pt2, false, true);
            context.LineTo(pt6, true, true);
        }
        else
        {
            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, false, true);
            context.LineTo(pt4, true, true);
        }
    }
    #endregion
}

}文章来源地址https://www.toymoban.com/news/detail-618442.html

到了这里,关于wpf自定义控件-单/双箭头线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • wpf 为自定义控件添加滚动条

    在WPF中为自定义控件添加滚动条通常涉及将自定义控件置于 ScrollViewer 控件内,并根据需要配置ScrollViewer的属性。以下是一个基本步骤说明: 创建自定义控件 :首先,你有一个自定义控件(比如名为 RWrapPanel ,继承自 WrapPanel 并实现 IScrollInfo 接口以进行平滑滚动管理)。 嵌

    2024年02月01日
    浏览(39)
  • WPF grid控件定义行和列

    在此已经学习了wpf Grid控件, WPF布局控件Grid的基本使用 - 使用kaxaml_bcbobo21cn的博客-CSDN博客 下面继续学习; 定义3行3列的基本代码如下;为了看清效果,设置 ShowGridLines=\\\"True\\\";   减少一列,效果如下;   只有行,没有列;   指定第一列的宽度;   第一列指定宽度,剩下2列

    2024年02月13日
    浏览(49)
  • WPF自定义控件库之Window窗口

    在WPF开发中,默认控件的样式常常无法满足实际的应用需求,我们通常都会采用引入第三方控件库的方式来美化UI,使得应用软件的设计风格更加统一。常用的WPF的UI控件库主要有以下几种,如: Modern UI for WPF , MaterialDesignInXamlToolkit ,PanuonUI,Newbeecoder.UI,WPF UI , AduSkin ,

    2024年02月08日
    浏览(42)
  • WPF自定义控件之ItemsControl鱼眼效果

    原理 先获取鼠标在控件中的坐标,在获取其每一项相对于ItemsControl的坐标,然后计算每一项离当前鼠标的距离,在根据这个距离,对其每一项进行适当的缩放 实现 创建一个类,命名为FishEyeItemsControl   public class FishEyeItemsControl : ItemsControl   添加应用鱼眼效果方法(控制其控

    2024年02月04日
    浏览(37)
  • WPF 自定义控件完成库容表盘显示效果

    先看一下显示效果:        需要注意的地方有以下几点: 表盘的刻度分部,长刻度和短刻度显示。 在数值80W时,需要更改刻度盘的颜色渐变。 在数值80W时,更改库容总数背景的显示,也是颜色渐变。刻度盘控件属性定义: 刻度盘的定义: 设置刻度盘的style: 库容总数背

    2024年02月16日
    浏览(35)
  • WPF自定义嵌入弹框控件,支持内容标题自定义

    最近为了实现WPF中弹框组件写了一个小例子: 组件要求: 1.自定义标题 2自定义标题颜色 3提供关闭按钮, 4.弹框内容可由调用方自行嵌入 xaml代码 UserControl x:Class=\\\"WpfApp1.Controls.CustomPopup\\\"              xmlns=\\\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\\\"              xmlns:x=\\\"

    2024年02月16日
    浏览(43)
  • 在 WPF 为你的自定义控件添加属性

    首先,在你的自定义控件类 (示例: UserControl1 ) 添加以下代码: 以上代码简化了官方方法的流程,以便你不用再去额外输入不必要的参数,并提前对 sender 进行类型转换。 此后,添加一个属性只需要添加以下代码即可,相比传统方法看起来会非常直观,非常省事。 以上代码中

    2024年02月11日
    浏览(48)
  • WPF --- 非Button自定义控件实现点击功能

    今天在做一个设置文件夹路径的功能,就是一个文本框,加个按钮,点击按钮,弹出 FolderBrowserDialog 再选择文件夹路径,简单做法,可以直接 StackPanel 横向放置一个 TextBox 和一个 Image Button ,然后点击按钮在 后台代码中给 ViewModel 的 FilePath 赋值。但是这样属实不够优雅,UI 不

    2024年02月12日
    浏览(38)
  • WPF 自定义DataGrid控件样式模板5个

    样式一: 样式代码: 初始化绑定数据C#代码: 效果展示: 样式二: 上面的代码实现了隔行换色的效果,但是没有鼠标选中效果。另外有些用户希望能够进行列头拖动及排序。那么就需要做以下更改: 添加DataGridRow样式: 在引用时,设置DataGrid的RowStyle=\\\"{StaticResource AlertCoun

    2023年04月27日
    浏览(43)
  • 使用WPF开发自定义用户控件,以及实现相关自定义事件的处理

    在前面随笔《使用Winform开发自定义用户控件,以及实现相关自定义事件的处理》中介绍了Winform用户自定义控件的处理,对于Winform自定义的用户控件来说,它的呈现方式主要就是基于GDI+进行渲染的,对于数量不多的控件呈现,一般不会觉察性能有太多的问题,随着控件的数量

    2024年02月02日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包