- A+
所属分类:.NET技术
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; namespace WYL_WPF_Controls { /// <summary> /// UCLineflow.xaml 的交互逻辑 /// </summary> public partial class UCLineflow : UserControl { #region 变量/属性 Path linePath = new Path(); /// <summary> /// 定时器 /// </summary> private DispatcherTimer m_timer; //private Task _taskTime; private bool _taskStatus = false; /// <summary> /// The int pen width /// </summary> int intPenWidth = 0; /// <summary> /// The int line left /// </summary> int intLineLeft = 0; [Description("宽度"), Category("自定义")] public double UcWidth { get { return (double)GetValue(ucwidth); } set { SetValue(ucwidth, value); } } public static readonly DependencyProperty ucwidth = DependencyProperty.Register("UcWidth", typeof(double), typeof(UCLineflow), new FrameworkPropertyMetadata(200.0, FrameworkPropertyMetadataOptions.AffectsRender)); [Description("高度"), Category("自定义")] public double UcHeight { get { return (double)GetValue(ucHeight); } set { SetValue(ucHeight, value); } } public static readonly DependencyProperty ucHeight = DependencyProperty.Register("UcHeight", typeof(double), typeof(UCLineflow), new FrameworkPropertyMetadata(50.0, FrameworkPropertyMetadataOptions.AffectsRender)); [Description("样式"), Category("自定义")] public LineflowStyle Lineflowstyle { get { return (LineflowStyle)GetValue(lineflowstyle); } set { SetValue(lineflowstyle, value); } } public static readonly DependencyProperty lineflowstyle = //DependencyProperty.Register("Lineflowstyle", typeof(LineflowStyle), typeof(UCLineflow), new PropertyMetadata(LineflowStyle.Horizontal_None_None)); DependencyProperty.Register("Lineflowstyle", typeof(LineflowStyle), typeof(UCLineflow), new FrameworkPropertyMetadata(LineflowStyle.Horizontal_None_None, FrameworkPropertyMetadataOptions.AffectsRender)); [Description("颜色"), Category("自定义")] public Brush LineStroke { get { return (Brush)GetValue(lineStroke); } set { SetValue(lineStroke, value); } } public static readonly DependencyProperty lineStroke = //DependencyProperty.Register("LineStroke", typeof(Brush), typeof(UCLineflow), new PropertyMetadata(Brushes.Red)); DependencyProperty.Register("LineStroke", typeof(Brush), typeof(UCLineflow), new FrameworkPropertyMetadata(Brushes.Red, FrameworkPropertyMetadataOptions.AffectsRender)); [Description("液体流动方向"), Category("自定义")] public LiquidDirection Liquid { get { return (LiquidDirection)GetValue(liquidDirection); } set { SetValue(liquidDirection, value); } } public static readonly DependencyProperty liquidDirection = //DependencyProperty.Register("Liquid", typeof(LiquidDirection), typeof(UCLineflow), new PropertyMetadata(LiquidDirection.Forward)); DependencyProperty.Register("Liquid", typeof(LiquidDirection), typeof(UCLineflow), new FrameworkPropertyMetadata(LiquidDirection.Forward, FrameworkPropertyMetadataOptions.AffectsRender)); [Description("液体流速,越小,速度越快"), Category("自定义")] public int LiquidSpeed { get { return (int)GetValue(liquidSpeed); } set { if (value <= 0) return; SetValue(liquidSpeed, value); m_timer.Interval = TimeSpan.FromMilliseconds(value); } } public static readonly DependencyProperty liquidSpeed = DependencyProperty.Register("LiquidSpeed", typeof(int), typeof(UCLineflow), new PropertyMetadata(100)); int conduitWidth = 50; [Description("管道宽度,当ConduitStyle的值是Horizontal_Tilt_Up,Horizontal_Tilt_Down,Vertical_Tilt_Left,Vertical_Tilt_Right时有效,其他时候将根据管道大小使用自动宽度"), Category("自定义")] public int ConduitWidth { get { return conduitWidth; } set { conduitWidth = value; } } #endregion public UCLineflow() { InitializeComponent(); this.Loaded += UCLineflow_Loaded; this.Unloaded += UCLineflow_Unloaded; this.SizeChanged += UCLineflow_SizeChanged; //this.Width = 200; //this.Height = 50; //this.RenderSize = new Size(200, 50); DrawShap(); grid.Children.Add(linePath); m_timer = new DispatcherTimer(); m_timer.Interval = TimeSpan.FromMilliseconds(100); } private void UCLineflow_SizeChanged(object sender, SizeChangedEventArgs e) { intPenWidth = (int)(Lineflowstyle.ToString().StartsWith("H") ? this.Height : this.Width); DrawShap(); } private void UCLineflow_Loaded(object sender, RoutedEventArgs e) { m_timer.Tick += M_timer_Tick; m_timer.Start(); var dataModel = new LineflowModel { UcWidth = UcWidth, UcHeight = UcHeight }; this.DataContext = dataModel; } private void UCLineflow_Unloaded(object sender, RoutedEventArgs e) { m_timer.Tick -= M_timer_Tick; m_timer.Stop(); m_timer = null; } private void M_timer_Tick(object sender, EventArgs e) { intLineLeft += 2; if (intLineLeft >= 12) intLineLeft = 0; linePath.StrokeDashOffset = intLineLeft * (Liquid == LiquidDirection.Forward ? -1 : 1); DrawShap(); } /// <summary> /// 重绘 /// </summary> /// <param name="drawingContext"></param> protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); if (Liquid == LiquidDirection.None) { m_timer.Stop(); } else { m_timer.Start(); } DrawShap(); } private void DrawShap() { double acH = this.Height; double acW = this.Width; linePath.Stroke = LineStroke; linePath.StrokeThickness = 4; linePath.StrokeDashArray = new DoubleCollection() { 6, 6 }; PathGeometry pathGeometry = new PathGeometry(); PathFigure figure = new PathFigure(); PathSegmentCollection ps = new PathSegmentCollection(); ArcSegment arc = new ArcSegment(); //RotateTransform rt = new RotateTransform(); switch (Lineflowstyle) { #region H English:H case LineflowStyle.Horizontal_None_None: //rt.Angle = 0; figure.StartPoint = new Point(0, acH/2); ps.Add(new LineSegment(new Point(acW, acH / 2), true)); break; default: //this.RenderTransform.ReadLocalValue. //rt.Angle = 90; //this.RenderTransform = rt; figure.StartPoint = new Point(acH / 2, 0); arc.Point = new Point(acH, acH / 2); arc.Size = new Size(acH / 2, acH / 2); ps.Add(arc); ps.Add(new LineSegment(new Point(acW, acH / 2), true)); break; #endregion } figure.Segments = ps; pathGeometry.Figures.Add(figure); linePath.Data = pathGeometry; } } public class LineflowModel { public double UcWidth { get; set; } public double UcHeight { get; set; } } /// <summary> /// 线条方向枚举 /// </summary> public enum LiquidDirection { /// <summary> /// The none /// </summary> None, /// <summary> /// The forward /// </summary> Forward, /// <summary> /// The backward /// </summary> Backward } /// <summary> /// 线条流动样式 /// </summary> public enum LineflowStyle { /// <summary> /// 直线 The horizontal none none /// </summary> Horizontal_None_None, /// <summary> /// 左上The horizontal up none /// </summary> Horizontal_Up_None, /// <summary> /// 左下The horizontal down none /// </summary> Horizontal_Down_None, /// <summary> /// 右上The horizontal none up /// </summary> Horizontal_None_Up, /// <summary> /// 右下The horizontal none down /// </summary> Horizontal_None_Down, /// <summary> /// 左下右上The horizontal down up /// </summary> Horizontal_Down_Up, /// <summary> /// 左上右下The horizontal up down /// </summary> Horizontal_Up_Down, /// <summary> /// 左上,右上The horizontal up up /// </summary> Horizontal_Up_Up, /// <summary> /// 左下右下The horizontal down down /// </summary> Horizontal_Down_Down, /// <summary> /// 向上倾斜The horizontal tilt up /// </summary> Horizontal_Tilt_Up, /// <summary> /// 向下倾斜The horizontal tilt down /// </summary> Horizontal_Tilt_Down, /// <summary> /// 竖线The vertical none none /// </summary> Vertical_None_None, /// <summary> /// 上左The vertical left none /// </summary> Vertical_Left_None, /// <summary> /// 上右The vertical right none /// </summary> Vertical_Right_None, /// <summary> /// 下左The vertical none left /// </summary> Vertical_None_Left, /// <summary> /// 下右The vertical none right /// </summary> Vertical_None_Right, /// <summary> /// 上左下右The vertical left right /// </summary> Vertical_Left_Right, /// <summary> /// 上右下左The vertical right left /// </summary> Vertical_Right_Left, /// <summary> /// 上左下左The vertical left left /// </summary> Vertical_Left_Left, /// <summary> /// 上右下右The vertical right left /// </summary> Vertical_Right_Right, /// <summary> /// 向左倾斜The vertical tilt /// </summary> Vertical_Tilt_Left, /// <summary> /// 向右倾斜The vertical tilt right /// </summary> Vertical_Tilt_Right } }