using System; using System.Collections.Generic; 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.Animation; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace MECF.Framework.UI.Client.IndustrialControl { /// /// HslPipeLineThree.xaml 的交互逻辑 /// public partial class PipeLineThree : UserControl { public PipeLineThree( ) { InitializeComponent( ); offect1DoubleAnimation = new DoubleAnimation( 0, 10, TimeSpan.FromMilliseconds( 1000 ) ); offect1DoubleAnimation.RepeatBehavior = RepeatBehavior.Forever; BeginAnimation( LineOffect1Property, offect1DoubleAnimation ); offect2DoubleAnimation = new DoubleAnimation( 0, 10, TimeSpan.FromMilliseconds( 1000 ) ); offect2DoubleAnimation.RepeatBehavior = RepeatBehavior.Forever; BeginAnimation( LineOffect2Property, offect2DoubleAnimation ); offect3DoubleAnimation = new DoubleAnimation( 0, 10, TimeSpan.FromMilliseconds( 1000 ) ); offect3DoubleAnimation.RepeatBehavior = RepeatBehavior.Forever; BeginAnimation( LineOffect3Property, offect3DoubleAnimation ); } /// /// 获取或设置管道控件的边缘颜色 /// public Color EdgeColor { get { return (Color)GetValue( EdgeColorProperty ); } set { SetValue( EdgeColorProperty, value ); } } // Using a DependencyProperty as the backing store for EdgeColor. This enables animation, styling, binding, etc... public static readonly DependencyProperty EdgeColorProperty = DependencyProperty.Register( "EdgeColor", typeof( Color ), typeof(PipeLineThree), new PropertyMetadata( Colors.DimGray ) ); /// /// 管道的中心颜色 /// public Color CenterColor { get { return (Color)GetValue( CenterColorProperty ); } set { SetValue( CenterColorProperty, value ); } } // Using a DependencyProperty as the backing store for CenterColor. This enables animation, styling, binding, etc... public static readonly DependencyProperty CenterColorProperty = DependencyProperty.Register( "CenterColor", typeof( Color ), typeof(PipeLineThree), new PropertyMetadata( Colors.LightGray ) ); /// /// 获取或设置管道1号线是否激活液体显示 /// public bool PipeLineActive1 { get { return (bool)GetValue( PipeLineActive1Property ); } set { SetValue( PipeLineActive1Property, value ); } } // Using a DependencyProperty as the backing store for PipeLineActive1. This enables animation, styling, binding, etc... public static readonly DependencyProperty PipeLineActive1Property = DependencyProperty.Register( "PipeLineActive1", typeof( bool ), typeof(PipeLineThree), new PropertyMetadata( false ) ); /// /// 获取或设置管道2号线是否激活液体显示 /// public bool PipeLineActive2 { get { return (bool)GetValue( PipeLineActive2Property ); } set { SetValue( PipeLineActive2Property, value ); } } // Using a DependencyProperty as the backing store for PipeLineActive2. This enables animation, styling, binding, etc... public static readonly DependencyProperty PipeLineActive2Property = DependencyProperty.Register( "PipeLineActive2", typeof( bool ), typeof(PipeLineThree), new PropertyMetadata( false ) ); /// /// 获取或设置管道3号线是否激活液体显示 /// public bool PipeLineActive3 { get { return (bool)GetValue( PipeLineActive3Property ); } set { SetValue( PipeLineActive3Property, value ); } } // Using a DependencyProperty as the backing store for PipeLineActive3. This enables animation, styling, binding, etc... public static readonly DependencyProperty PipeLineActive3Property = DependencyProperty.Register( "PipeLineActive3", typeof( bool ), typeof(PipeLineThree), new PropertyMetadata( false ) ); /// /// 获取或设置管道1号线液体流动的速度,0为静止,正数为正向流动,负数为反向流动 /// public double MoveSpeed1 { get { return (double)GetValue( MoveSpeed1Property ); } set { SetValue( MoveSpeed1Property, value ); } } // Using a DependencyProperty as the backing store for MoveSpeed1. This enables animation, styling, binding, etc... public static readonly DependencyProperty MoveSpeed1Property = DependencyProperty.Register( "MoveSpeed1", typeof( double ), typeof(PipeLineThree), new PropertyMetadata( 0d, new PropertyChangedCallback( MoveSpeed1PropertyChangedCallback ) ) ); public static void MoveSpeed1PropertyChangedCallback( DependencyObject dependency, DependencyPropertyChangedEventArgs e ) { PipeLineThree pipeLine = (PipeLineThree)dependency; pipeLine.UpdateMoveSpeed1( ); } private DoubleAnimation offect1DoubleAnimation = null; public void UpdateMoveSpeed1( ) { if (MoveSpeed1 > 0) { path1.Visibility = Visibility.Visible; offect1DoubleAnimation.From = 0d; offect1DoubleAnimation.To = 10d; offect1DoubleAnimation.Duration = TimeSpan.FromMilliseconds( 300 / MoveSpeed1 ); BeginAnimation( LineOffect1Property, offect1DoubleAnimation ); } else if (MoveSpeed1 < 0) { path1.Visibility = Visibility.Visible; offect1DoubleAnimation.From = 0d; offect1DoubleAnimation.To = -10d; offect1DoubleAnimation.Duration = TimeSpan.FromMilliseconds( 300 / Math.Abs( MoveSpeed1 ) ); BeginAnimation( LineOffect1Property, offect1DoubleAnimation ); } else { offect1DoubleAnimation.From = 0d; offect1DoubleAnimation.To = 0d; BeginAnimation( LineOffect1Property, offect1DoubleAnimation ); path1.Visibility = Visibility.Hidden; } } /// /// 获取或设置管道2号线液体流动的速度,0为静止,正数为正向流动,负数为反向流动 /// public double MoveSpeed2 { get { return (double)GetValue( MoveSpeed2Property ); } set { SetValue( MoveSpeed2Property, value ); } } // Using a DependencyProperty as the backing store for MoveSpeed2. This enables animation, styling, binding, etc... public static readonly DependencyProperty MoveSpeed2Property = DependencyProperty.Register( "MoveSpeed2", typeof( double ), typeof(PipeLineThree), new PropertyMetadata( 0d, new PropertyChangedCallback( MoveSpeed2PropertyChangedCallback ) ) ); public static void MoveSpeed2PropertyChangedCallback( DependencyObject dependency, DependencyPropertyChangedEventArgs e ) { PipeLineThree pipeLine = (PipeLineThree)dependency; pipeLine.UpdateMoveSpeed2( ); } private DoubleAnimation offect2DoubleAnimation = null; public void UpdateMoveSpeed2( ) { if (MoveSpeed2 > 0) { path2.Visibility = Visibility.Visible; offect2DoubleAnimation.From = 0d; offect2DoubleAnimation.To = 10d; offect2DoubleAnimation.Duration = TimeSpan.FromMilliseconds( 300 / MoveSpeed2 ); BeginAnimation( LineOffect2Property, offect2DoubleAnimation ); } else if (MoveSpeed2 < 0) { path2.Visibility = Visibility.Visible; offect2DoubleAnimation.From = 0d; offect2DoubleAnimation.To = -10d; offect2DoubleAnimation.Duration = TimeSpan.FromMilliseconds( 300 / Math.Abs( MoveSpeed2 ) ); BeginAnimation( LineOffect2Property, offect2DoubleAnimation ); } else { offect2DoubleAnimation.From = 0d; offect2DoubleAnimation.To = 0d; BeginAnimation( LineOffect2Property, offect2DoubleAnimation ); path2.Visibility = Visibility.Hidden; } } /// /// 获取或设置管道3号线液体流动的速度,0为静止,正数为正向流动,负数为反向流动 /// public double MoveSpeed3 { get { return (double)GetValue( MoveSpeed3Property ); } set { SetValue( MoveSpeed3Property, value ); } } // Using a DependencyProperty as the backing store for MoveSpeed3. This enables animation, styling, binding, etc... public static readonly DependencyProperty MoveSpeed3Property = DependencyProperty.Register( "MoveSpeed3", typeof( double ), typeof(PipeLineThree), new PropertyMetadata( 0d, new PropertyChangedCallback( MoveSpeed3PropertyChangedCallback ) ) ); public static void MoveSpeed3PropertyChangedCallback( DependencyObject dependency, DependencyPropertyChangedEventArgs e ) { PipeLineThree pipeLine = (PipeLineThree)dependency; pipeLine.UpdateMoveSpeed3( ); } private DoubleAnimation offect3DoubleAnimation = null; public void UpdateMoveSpeed3( ) { if (MoveSpeed3 > 0) { path3.Visibility = Visibility.Visible; offect3DoubleAnimation.From = 0d; offect3DoubleAnimation.To = 10d; offect3DoubleAnimation.Duration = TimeSpan.FromMilliseconds( 300 / MoveSpeed3 ); BeginAnimation( LineOffect3Property, offect3DoubleAnimation ); } else if (MoveSpeed3 < 0) { path3.Visibility = Visibility.Visible; offect3DoubleAnimation.From = 0d; offect3DoubleAnimation.To = -10d; offect3DoubleAnimation.Duration = TimeSpan.FromMilliseconds( 300 / Math.Abs( MoveSpeed3 ) ); BeginAnimation( LineOffect3Property, offect3DoubleAnimation ); } else { offect3DoubleAnimation.From = 0d; offect3DoubleAnimation.To = 0d; BeginAnimation( LineOffect3Property, offect3DoubleAnimation ); path3.Visibility = Visibility.Hidden; } } /// /// 管道1的偏移 /// public double LineOffect1 { get { return (double)GetValue( LineOffect1Property ); } set { SetValue( LineOffect1Property, value ); } } // Using a DependencyProperty as the backing store for LineOffect1. This enables animation, styling, binding, etc... public static readonly DependencyProperty LineOffect1Property = DependencyProperty.Register( "LineOffect1", typeof( double ), typeof(PipeLineThree), new PropertyMetadata( 0d ) ); /// /// 管道2的偏移 /// public double LineOffect2 { get { return (double)GetValue( LineOffect2Property ); } set { SetValue( LineOffect2Property, value ); } } // Using a DependencyProperty as the backing store for LineOffect2. This enables animation, styling, binding, etc... public static readonly DependencyProperty LineOffect2Property = DependencyProperty.Register( "LineOffect2", typeof( double ), typeof(PipeLineThree), new PropertyMetadata( 0d ) ); /// /// 管道3的偏移 /// public double LineOffect3 { get { return (double)GetValue( LineOffect3Property ); } set { SetValue( LineOffect3Property, value ); } } // Using a DependencyProperty as the backing store for LineOffect3. This enables animation, styling, binding, etc... public static readonly DependencyProperty LineOffect3Property = DependencyProperty.Register( "LineOffect3", typeof( double ), typeof(PipeLineThree), new PropertyMetadata( 0d ) ); /// /// 获取或设置中间管道线的宽度信息,默认为3 /// public int PipeLineWidth { get { return (int)GetValue( PipeLineWidthProperty ); } set { SetValue( PipeLineWidthProperty, value ); } } // Using a DependencyProperty as the backing store for PipeLineWidth. This enables animation, styling, binding, etc... public static readonly DependencyProperty PipeLineWidthProperty = DependencyProperty.Register( "PipeLineWidth", typeof( int ), typeof(PipeLineThree), new PropertyMetadata( 2 ) ); /// /// 获取或设置流动状态时管道控件的中心颜色 /// public Color ActiveLineCenterColor { get { return (Color)GetValue( ActiveLineCenterColorProperty ); } set { SetValue( ActiveLineCenterColorProperty, value ); } } // Using a DependencyProperty as the backing store for ActiveLineCenterColor. This enables animation, styling, binding, etc... public static readonly DependencyProperty ActiveLineCenterColorProperty = DependencyProperty.Register( "ActiveLineCenterColor", typeof( Color ), typeof(PipeLineThree), new PropertyMetadata( Colors.DodgerBlue ) ); /// /// 获取或设置管道的宽度,默认为30 /// public int PipeWidth { get { return (int)GetValue( PipeWidthProperty ); } set { SetValue( PipeWidthProperty, value ); } } // Using a DependencyProperty as the backing store for PipeWidth. This enables animation, styling, binding, etc... public static readonly DependencyProperty PipeWidthProperty = DependencyProperty.Register( "PipeWidth", typeof( int ), typeof(PipeLineThree), new PropertyMetadata( 30, new PropertyChangedCallback( PipeWidthPropertyChangedCallback ) ) ); public static void PipeWidthPropertyChangedCallback( DependencyObject dependency, DependencyPropertyChangedEventArgs e ) { PipeLineThree pipeLine = (PipeLineThree)dependency; pipeLine.PipeWidthUpdate( ); } public void PipeWidthUpdate( ) { UpdatePath( ); } protected override void OnRenderSizeChanged( SizeChangedInfo sizeInfo ) { UpdatePath( ); base.OnRenderSizeChanged( sizeInfo ); } public void UpdatePath( ) { polygon1.Points = new PointCollection( new Point[] { new Point(ActualWidth / 2 - PipeWidth / 2d, PipeWidth), new Point(ActualWidth / 2, PipeWidth / 2d), new Point(ActualWidth / 2 + PipeWidth / 2d, PipeWidth), new Point(ActualWidth / 2 + PipeWidth / 2d, ActualHeight), new Point(ActualWidth / 2 - PipeWidth / 2d, ActualHeight), new Point(ActualWidth / 2 - PipeWidth / 2d, PipeWidth), } ); var g1 = new StreamGeometry( ); using (StreamGeometryContext context = g1.Open( )) { context.BeginFigure( new Point( 0, PipeWidth / 2d ), false, false ); context.LineTo( new Point( ActualWidth, PipeWidth / 2d ), true, false ); } path1.Data = g1; var g2 = new StreamGeometry( ); using (StreamGeometryContext context = g2.Open( )) { context.BeginFigure( new Point( 0, PipeWidth / 2d ), false, false ); context.LineTo( new Point( ActualWidth / 2 - PipeWidth / 2d, PipeWidth / 2d ), true, false ); context.ArcTo( new Point( ActualWidth / 2, PipeWidth ), new Size( PipeWidth / 2d, PipeWidth / 2d ), 0, false, SweepDirection.Clockwise, true, false ); context.LineTo( new Point( ActualWidth / 2, ActualHeight ), true, false ); } path2.Data = g2; var g3 = new StreamGeometry( ); using (StreamGeometryContext context = g3.Open( )) { context.BeginFigure( new Point( ActualWidth, PipeWidth / 2d ), false, false ); context.LineTo( new Point( ActualWidth / 2 + PipeWidth / 2d, PipeWidth / 2d ), true, false ); context.ArcTo( new Point( ActualWidth / 2, PipeWidth ), new Size( PipeWidth / 2d, PipeWidth / 2d ), 0, false, SweepDirection.Counterclockwise, true, false ); context.LineTo( new Point( ActualWidth / 2, ActualHeight ), true, false ); } path3.Data = g3; } } }