using MECF.Framework.UI.Client.IndustrialControl.Converters; 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 { /// /// PipeLineKnot.xaml 的交互逻辑 /// public partial class PipeLineKnot : UserControl { #region Contructor /// /// 实例化一个管道对象 /// public PipeLineKnot() { InitializeComponent(); //Binding binding = new Binding(); //binding.Source = grid1; //binding.Path = new PropertyPath("ActualHeight"); //binding.Converter = new MultiplesValueConverter(); //binding.ConverterParameter = -1; //ellipe1.SetBinding( Canvas.TopProperty, binding ); } private DoubleAnimation offectDoubleAnimation = null; #endregion #region Property Dependency #region LeftDirection Property /// /// 设置左边的方向 /// public HslPipeTurnDirection LeftDirection { get { return (HslPipeTurnDirection)GetValue(LeftDirectionProperty); } set { SetValue(LeftDirectionProperty, value); } } // Using a DependencyProperty as the backing store for LeftDirection. This enables animation, styling, binding, etc... public static readonly DependencyProperty LeftDirectionProperty = DependencyProperty.Register("LeftDirection", typeof(HslPipeTurnDirection), typeof(PipeLineKnot), new PropertyMetadata(HslPipeTurnDirection.Left, new PropertyChangedCallback(LeftDirectionPropertyChangedCallback))); /// /// Description /// public static readonly DependencyProperty ThroughInnerColorProperty = DependencyProperty.Register("ThroughInnerColor", typeof(string), typeof(PipeLineKnot), new FrameworkPropertyMetadata("White")); /// /// A property wrapper for the /// dependency property:
/// Description ///
public string ThroughInnerColor { get { return (string)GetValue(ThroughInnerColorProperty); } set { SetValue(ThroughInnerColorProperty, value); } } public static void LeftDirectionPropertyChangedCallback(System.Windows.DependencyObject dependency, System.Windows.DependencyPropertyChangedEventArgs e) { PipeLine pipeLine = (PipeLine)dependency; pipeLine.UpdateLeftDirectionBinding(); } public void UpdateLeftDirectionBinding() { if (LeftDirection == HslPipeTurnDirection.Left) { Binding binding = new Binding(); binding.Source = grid1; binding.Path = new PropertyPath("ActualHeight"); binding.Converter = new MultiplesValueConverter(); binding.ConverterParameter = 0; } else if (LeftDirection == HslPipeTurnDirection.Right) { Binding binding = new Binding(); binding.Source = grid1; binding.Path = new PropertyPath("ActualHeight"); binding.Converter = new MultiplesValueConverter(); binding.ConverterParameter = -1; } else { } // UpdatePathData(); } public void UpdatePath() { polygon1.Points = new PointCollection(new Point[] { new Point(0, ActualHeight*0.6), new Point(0, ActualHeight), new Point( ActualHeight*0.7, ActualHeight), new Point( ActualHeight *0.3, ActualHeight*0.6), }); polygon2.Points = new PointCollection(new Point[] { new Point(ActualHeight*1.9, ActualHeight*0.6), new Point(ActualHeight*1.5, ActualHeight), new Point( ActualHeight*2.2, ActualHeight), new Point( ActualHeight*2.2 , ActualHeight*0.6), }); } #endregion #region RightDirection Property /// /// 设置右边的方向 /// public HslPipeTurnDirection RightDirection { get { return (HslPipeTurnDirection)GetValue(RightDirectionProperty); } set { SetValue(RightDirectionProperty, value); } } // Using a DependencyProperty as the backing store for LeftDirection. This enables animation, styling, binding, etc... public static readonly DependencyProperty RightDirectionProperty = DependencyProperty.Register("RightDirection", typeof(HslPipeTurnDirection), typeof(PipeLineKnot), new PropertyMetadata(HslPipeTurnDirection.Right, new PropertyChangedCallback(RightDirectionPropertyChangedCallback))); public static void RightDirectionPropertyChangedCallback(System.Windows.DependencyObject dependency, System.Windows.DependencyPropertyChangedEventArgs e) { PipeLine pipeLine = (PipeLine)dependency; pipeLine.UpdateRightDirectionBinding(); } public void UpdateRightDirectionBinding() { if (RightDirection == HslPipeTurnDirection.Left) { Binding binding = new Binding(); binding.Source = grid1; binding.Path = new PropertyPath("ActualHeight"); binding.Converter = new MultiplesValueConverter(); binding.ConverterParameter = 0; } else if (RightDirection == HslPipeTurnDirection.Right) { Binding binding = new Binding(); binding.Source = grid1; binding.Path = new PropertyPath("ActualHeight"); binding.Converter = new MultiplesValueConverter(); binding.ConverterParameter = -1; } else { } // UpdatePathData(); } #endregion #region PipeLineActive Property public bool PipeLineActive { get { return (bool)GetValue(PipeLineActiveProperty); } set { SetValue(PipeLineActiveProperty, value); } } // Using a DependencyProperty as the backing store for PipeLineActive. This enables animation, styling, binding, etc... public static readonly DependencyProperty PipeLineActiveProperty = DependencyProperty.Register("PipeLineActive", typeof(bool), typeof(PipeLineKnot), new PropertyMetadata(false)); #endregion protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo) { UpdatePath(); // UpdatePathData(); base.OnRenderSizeChanged(sizeInfo); } #region LineOffect Property public double LineOffect { get { return (double)GetValue(LineOffectProperty); } set { SetValue(LineOffectProperty, value); } } // Using a DependencyProperty as the backing store for LineOffect. This enables animation, styling, binding, etc... public static readonly DependencyProperty LineOffectProperty = DependencyProperty.Register("LineOffect", typeof(double), typeof(PipeLineKnot), new PropertyMetadata(0d)); StreamGeometry sg = new StreamGeometry(); public void UpdatePathData() { //Console.WriteLine("Size Changed"); double height = ActualHeight; double width = ActualWidth; using (StreamGeometryContext context = sg.Open()) { context.BeginFigure(new Point(0, height * 0.6), false, false); context.LineTo(new Point(height * 0.3, height * 0.6), true, false); context.ArcTo(new Point(height * 1.2, height * 0.6), new Size(height * 0.2, height * 0.2), 180, false, SweepDirection.Clockwise, true, false); context.LineTo(new Point(height * 2.5, height * 0.6), true, false); //if (LeftDirection == HslPipeTurnDirection.Left) //{ // context.BeginFigure( new Point( ActualHeight / 2, ActualHeight ), false, false ); // context.ArcTo( new Point( ActualHeight, ActualHeight / 2 ), new Size( ActualHeight / 2, ActualHeight / 2 ), 0, false, SweepDirection.Clockwise, true, false ); //} //else if (LeftDirection == HslPipeTurnDirection.Right) //{ // context.BeginFigure( new Point( ActualHeight / 2, 0 ), false, false ); // context.ArcTo( new Point( ActualHeight, ActualHeight / 2 ), new Size( ActualHeight / 2, ActualHeight / 2 ), 0, false, SweepDirection.Counterclockwise, true, false ); //} //else //{ // context.BeginFigure( new Point( 0, ActualHeight / 2 ), false, false ); // context.LineTo( new Point( ActualHeight, ActualHeight / 2 ), true, false ); //} //context.LineTo( new Point( ActualWidth - ActualHeight, ActualHeight / 2 ), true, false ); //if (RightDirection == HslPipeTurnDirection.Left) //{ // context.ArcTo( new Point( ActualWidth - ActualHeight / 2, ActualHeight ), new Size( ActualHeight / 2, ActualHeight / 2 ), 0, false, SweepDirection.Clockwise, true, false ); //} //else if (RightDirection == HslPipeTurnDirection.Right) //{ // context.ArcTo( new Point( ActualWidth - ActualHeight / 2, 0 ), new Size( ActualHeight / 2, ActualHeight / 2 ), 0, false, SweepDirection.Counterclockwise, true, false ); //} //else //{ // context.LineTo( new Point( ActualWidth, ActualHeight / 2 ), true, false ); //} } //sg.Freeze(); path1.Data = sg; } #endregion #region MoveSpeed Property /// /// 获取或设置流动的速度 /// public double MoveSpeed { get { return (double)GetValue(MoveSpeedProperty); } set { SetValue(MoveSpeedProperty, value); } } // Using a DependencyProperty as the backing store for MoveSpeed. This enables animation, styling, binding, etc... public static readonly DependencyProperty MoveSpeedProperty = DependencyProperty.Register("MoveSpeed", typeof(double), typeof(PipeLineKnot), new PropertyMetadata(0.0d, new PropertyChangedCallback(MoveSpeedPropertyChangedCallback))); public static void MoveSpeedPropertyChangedCallback(DependencyObject dependency, DependencyPropertyChangedEventArgs e) { PipeLineKnot pipeLine = (PipeLineKnot)dependency; pipeLine.UpdateMoveSpeed(); } private Storyboard storyboard = new Storyboard(); public void UpdateMoveSpeed() { if (MoveSpeed > 0) { UpdatePathData(); path1.Visibility = Visibility.Visible; offectDoubleAnimation = new DoubleAnimation(0d, 10d, TimeSpan.FromMilliseconds(300 / MoveSpeed)); offectDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever; BeginAnimation(LineOffectProperty, offectDoubleAnimation); } else if (MoveSpeed < 0) { UpdatePathData(); path1.Visibility = Visibility.Visible; offectDoubleAnimation = new DoubleAnimation(0d, -10d, TimeSpan.FromMilliseconds(300 / Math.Abs(MoveSpeed))); offectDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever; BeginAnimation(LineOffectProperty, offectDoubleAnimation); } else { if (path1.Data != null) { path1.Data = null; offectDoubleAnimation.FillBehavior = FillBehavior.Stop; offectDoubleAnimation = null; path1.Visibility = Visibility.Hidden; } } } #endregion #region CenterColor Property /// /// 管道的中心颜色 /// 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(PipeLineKnot), new PropertyMetadata(Colors.LightGray)); #endregion #region PipeLineWidth Property /// /// 管道活动状态时的中心线的线条宽度 /// 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(PipeLineKnot), new PropertyMetadata(2)); #endregion #region ActiveLineCenterColor Property /// /// 管道活动状态时的中心线的颜色信息 /// 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(PipeLineKnot), new PropertyMetadata(Colors.DodgerBlue)); #endregion #region MyRegion /// /// 管道控件的边缘颜色 /// 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(PipeLineKnot), new PropertyMetadata(Colors.DimGray)); public static readonly DependencyProperty KnotElliColorProperty = DependencyProperty.Register("KnotElliColor", typeof(string), typeof(PipeLineKnot), new FrameworkPropertyMetadata("Black")); /// /// A property wrapper for the /// dependency property:
/// Description ///
public string KnotElliColor { get { return (string)GetValue(KnotElliColorProperty); } set { SetValue(KnotElliColorProperty, value); } } #endregion #endregion } }