using SWRIS.Models; using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; namespace SWRIS.Controls { /// /// RopeControl.xaml 的交互逻辑 /// public partial class RopeEquipmentControl : UserControl { private readonly Storyboard _animationStoryboard; public RopeEquipmentControl() { InitializeComponent(); // 初始化动画 _animationStoryboard = (Storyboard)Resources["RopeAnimation"]; // 设置初始动画值 UpdateAnimationValues(); } #region 依赖属性 // 绳索高度 public static readonly DependencyProperty RopeHeightProperty = DependencyProperty.Register("RopeHeight", typeof(double), typeof(RopeEquipmentControl), new PropertyMetadata(900.0)); // 绳索图片 public static readonly DependencyProperty RopeImageSourceProperty = DependencyProperty.Register("RopeImageSource", typeof(ImageSource), typeof(RopeEquipmentControl)); // 设备图片 public static readonly DependencyProperty EquipmentImageSourceProperty = DependencyProperty.Register("EquipmentImageSource", typeof(ImageSource), typeof(RopeEquipmentControl)); // 是否运行动画 public static readonly DependencyProperty IsAnimationRunningProperty = DependencyProperty.Register("IsAnimationRunning", typeof(bool), typeof(RopeEquipmentControl), new PropertyMetadata(false, OnIsAnimationRunningChanged)); // 动画方向(正向/反向) public static readonly DependencyProperty IsAnimationReversedProperty = DependencyProperty.Register("IsAnimationReversed", typeof(bool), typeof(RopeEquipmentControl), new PropertyMetadata(false, OnAnimationDirectionChanged)); // 动画速度(秒) public static readonly DependencyProperty AnimationDurationProperty = DependencyProperty.Register("AnimationDuration", typeof(double), typeof(RopeEquipmentControl), new PropertyMetadata(0.5, OnAnimationDurationChanged)); // 数据面板位置 public static readonly DependencyProperty PanelMarginProperty = DependencyProperty.Register("PanelMargin", typeof(Thickness), typeof(RopeEquipmentControl)); // 数据面板文字大小 public static readonly DependencyProperty PanelNameFontSizeProperty = DependencyProperty.Register("PanelNameFontSize", typeof(double), typeof(RopeEquipmentControl), new PropertyMetadata(28d)); // 数据面板文字大小 public static readonly DependencyProperty PanelValueFontSizeProperty = DependencyProperty.Register("PanelValueFontSize", typeof(double), typeof(RopeEquipmentControl), new PropertyMetadata(28d)); // 设备图片位置 public static readonly DependencyProperty EquipmentTopPositionProperty = DependencyProperty.Register("EquipmentTopPosition", typeof(double), typeof(RopeEquipmentControl)); #endregion #region 属性包装器 public double RopeHeight { get => (double)GetValue(RopeHeightProperty); set => SetValue(RopeHeightProperty, value); } public ImageSource RopeImageSource { get => (ImageSource)GetValue(RopeImageSourceProperty); set => SetValue(RopeImageSourceProperty, value); } public ImageSource EquipmentImageSource { get => (ImageSource)GetValue(EquipmentImageSourceProperty); set => SetValue(EquipmentImageSourceProperty, value); } public bool IsAnimationRunning { get => (bool)GetValue(IsAnimationRunningProperty); set => SetValue(IsAnimationRunningProperty, value); } public bool IsAnimationReversed { get => (bool)GetValue(IsAnimationReversedProperty); set => SetValue(IsAnimationReversedProperty, value); } public double AnimationDuration { get => (double)GetValue(AnimationDurationProperty); set => SetValue(AnimationDurationProperty, value); } public Thickness PanelMargin { get => (Thickness)GetValue(PanelMarginProperty); set => SetValue(PanelMarginProperty, value); } public double PanelNameFontSize { get => (double)GetValue(PanelNameFontSizeProperty); set => SetValue(PanelNameFontSizeProperty, value); } public double PanelValueFontSize { get => (double)GetValue(PanelValueFontSizeProperty); set => SetValue(PanelValueFontSizeProperty, value); } public double EquipmentTopPosition { get => (double)GetValue(EquipmentTopPositionProperty); set => SetValue(EquipmentTopPositionProperty, value); } #endregion #region 动画控制 private static void OnIsAnimationRunningChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = (RopeEquipmentControl)d; control.UpdateAnimationState(); } private static void OnAnimationDirectionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = (RopeEquipmentControl)d; control.UpdateAnimationValues(); } private static void OnAnimationDurationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = (RopeEquipmentControl)d; control.UpdateAnimationValues(); } private void UpdateAnimationValues() { var rectAnimation = (RectAnimation)_animationStoryboard.Children[0]; rectAnimation.Duration = TimeSpan.FromSeconds(AnimationDuration); if (IsAnimationReversed) { rectAnimation.From = new Rect(0, -34, 40, 34); rectAnimation.To = new Rect(0, 0, 40, 34); } else { rectAnimation.From = new Rect(0, 0, 40, 34); rectAnimation.To = new Rect(0, -34, 40, 34); } if (IsAnimationRunning) { _animationStoryboard.Begin(this, true); } } private void UpdateAnimationState() { if (IsAnimationRunning) { _animationStoryboard.Begin(this, true); } else { _animationStoryboard.Stop(this); } } #endregion #region 公共方法 public void StartAnimation(bool reversed = false) { IsAnimationReversed = reversed; IsAnimationRunning = true; } public void StopAnimation() { IsAnimationRunning = false; } public void ReverseAnimation() { IsAnimationReversed = !IsAnimationReversed; } #endregion } }