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.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using MECF.Framework.UI.Client.IndustrialControl.Converters;
namespace MECF.Framework.UI.Client.IndustrialControl
{
///
/// UserControl1.xaml 的交互逻辑
///
public partial class GasSingularLine : UserControl
{
#region Contructor
///
/// 实例化一个管道对象
///
public GasSingularLine()
{
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 );
}
#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(GasSingularLine),
new PropertyMetadata(HslPipeTurnDirection.Left, new PropertyChangedCallback(LeftDirectionPropertyChangedCallback)));
public static void LeftDirectionPropertyChangedCallback(System.Windows.DependencyObject dependency, System.Windows.DependencyPropertyChangedEventArgs e)
{
GasSingularLine pipeLine = (GasSingularLine)dependency;
pipeLine.UpdateLeftDirectionBinding();
}
public void UpdateLeftDirectionBinding()
{
BindingOperations.ClearBinding(ellipe1, Canvas.TopProperty);
if (LeftDirection == HslPipeTurnDirection.Left)
{
canvas1.Visibility = Visibility.Visible;
Binding binding = new Binding();
binding.Source = grid1;
binding.Path = new PropertyPath("ActualHeight");
binding.Converter = new MultiplesValueConverter();
binding.ConverterParameter = 0;
ellipe1.SetBinding(Canvas.TopProperty, binding);
}
else if (LeftDirection == HslPipeTurnDirection.Right)
{
canvas1.Visibility = Visibility.Visible;
Binding binding = new Binding();
binding.Source = grid1;
binding.Path = new PropertyPath("ActualHeight");
binding.Converter = new MultiplesValueConverter();
binding.ConverterParameter = -1;
ellipe1.SetBinding(Canvas.TopProperty, binding);
}
else
{
canvas1.Visibility = Visibility.Collapsed;
}
// UpdatePathData();
}
#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(GasSingularLine),
new PropertyMetadata(HslPipeTurnDirection.Right, new PropertyChangedCallback(RightDirectionPropertyChangedCallback)));
public static void RightDirectionPropertyChangedCallback(System.Windows.DependencyObject dependency, System.Windows.DependencyPropertyChangedEventArgs e)
{
GasSingularLine pipeLine = (GasSingularLine)dependency;
pipeLine.UpdateRightDirectionBinding();
}
public void UpdateRightDirectionBinding()
{
BindingOperations.ClearBinding(ellipe2, Canvas.TopProperty);
if (RightDirection == HslPipeTurnDirection.Left)
{
canvas2.Visibility = Visibility.Visible;
Binding binding = new Binding();
binding.Source = grid1;
binding.Path = new PropertyPath("ActualHeight");
binding.Converter = new MultiplesValueConverter();
binding.ConverterParameter = 0;
ellipe2.SetBinding(Canvas.TopProperty, binding);
}
else if (RightDirection == HslPipeTurnDirection.Right)
{
canvas2.Visibility = Visibility.Visible;
Binding binding = new Binding();
binding.Source = grid1;
binding.Path = new PropertyPath("ActualHeight");
binding.Converter = new MultiplesValueConverter();
binding.ConverterParameter = -1;
ellipe2.SetBinding(Canvas.TopProperty, binding);
}
else
{
canvas2.Visibility = Visibility.Collapsed;
}
// 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(GasSingularLine), new PropertyMetadata(false));
#endregion
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
// 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(GasSingularLine), new PropertyMetadata(0d));
StreamGeometry sg = new StreamGeometry();
public void UpdatePathData()
{
//Console.WriteLine( "Size Changed" );
double height = Height;
double width = Width;
using (StreamGeometryContext context = sg.Open())
{
if (LeftDirection == HslPipeTurnDirection.Left)
{
context.BeginFigure(new Point(height * 0.5, height), false, false);
context.ArcTo(new Point(height, height * 0.5), new Size(height * 0.5, height * 0.5), 0, false, SweepDirection.Clockwise, true, false);
}
else if (LeftDirection == HslPipeTurnDirection.Right)
{
context.BeginFigure(new Point(height * 0.5, 0), false, false);
context.ArcTo(new Point(height, height * 0.5), new Size(height * 0.5, height * 0.5), 0, false, SweepDirection.Counterclockwise, true, false);
}
else
{
context.BeginFigure(new Point(0, height * 0.5), false, false);
context.LineTo(new Point(height, height * 0.5), true, false);
}
context.LineTo(new Point(width - height, height * 0.5), true, false);
if (RightDirection == HslPipeTurnDirection.Left)
{
context.ArcTo(new Point(width - height * 0.5, height), new Size(height * 0.5, height * 0.5), 0, false, SweepDirection.Clockwise, true, false);
}
else if (RightDirection == HslPipeTurnDirection.Right)
{
context.ArcTo(new Point(width - height * 0.5, 0), new Size(height * 0.5, height * 0.5), 0, false, SweepDirection.Counterclockwise, true, false);
}
else
{
context.LineTo(new Point(width, height * 0.5), 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(GasSingularLine), new PropertyMetadata(0.0d, new PropertyChangedCallback(MoveSpeedPropertyChangedCallback)));
public static void MoveSpeedPropertyChangedCallback(DependencyObject dependency, DependencyPropertyChangedEventArgs e)
{
GasSingularLine pipeLine = (GasSingularLine)dependency;
pipeLine.UpdateMoveSpeed();
}
private Storyboard storyboard = new Storyboard();
public void UpdateMoveSpeed()
{
//jet炉管删除流向动画
if (path1.Data != null)
{
path1.Data = null;
//offectDoubleAnimation.FillBehavior = FillBehavior.Stop;
//offectDoubleAnimation = null;
path1.Visibility = Visibility.Hidden;
}
return;
if (MoveSpeed > 0)
{
UpdatePathData();
path1.Visibility = Visibility.Visible;
VisualStateManager.GoToState(this, "WEFlowState", false);
//offectDoubleAnimation = new DoubleAnimation(0d, 10d, TimeSpan.FromMilliseconds(300 / MoveSpeed));
//offectDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
//BeginAnimation(LineOffectProperty, offectDoubleAnimation);
//Storyboard.SetTarget(offectDoubleAnimation, path1);
//Storyboard.SetTargetProperty(offectDoubleAnimation, "X");
//storyboard.Children.Add(offectDoubleAnimation);
//storyboard.Begin();
}
else if (MoveSpeed < 0)
{
UpdatePathData();
path1.Visibility = Visibility.Visible;
VisualStateManager.GoToState(this, "EWFlowState", false);
//offectDoubleAnimation = new DoubleAnimation(0d, -10d, TimeSpan.FromMilliseconds(300 / Math.Abs(MoveSpeed)));
//offectDoubleAnimation.FillBehavior = FillBehavior.HoldEnd;
//offectDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
//BeginAnimation(LineOffectProperty, offectDoubleAnimation);
//Storyboard.SetTarget(offectDoubleAnimation, path1);
////Storyboard.SetTargetProperty(offectDoubleAnimation, "(UIElement.RenderTransform).(CompositeTransform.ScaleY)");
//storyboard.Children.Add(offectDoubleAnimation);
//storyboard.Begin();
}
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(GasSingularLine), new PropertyMetadata(Colors.Green));
#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(GasSingularLine), 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(GasSingularLine), 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(GasSingularLine), new PropertyMetadata(Colors.Black));
#endregion
#endregion
}
}