WPF 制作机械手动画

偶然的机会想做一个双手臂运转的机械手动作动画,重要的是有前辈写好的可以模仿:WPF开发经验-实现一种三轴机械手控件 - 一团静火 - 博客园

shit,公司禁止上传图片了

-------------------------------------------------------------------------------------

涵盖知识:

1.不可不知的WPF转换(Transform)_wpf matrixtransform-CSDN博客;

2.WPF中的VisualState(视觉状态)_wpf visualstate-CSDN博客;

3.WPF中RenderTransform详解_rendertransformorigin-CSDN博客

----------------------------------------------------------------------------------------

把代码放上来

1.自定义的机械手控件

	public class WaferRobotControl: Control
	{
		static WaferRobotControl()
		{
			DefaultStyleKeyProperty.OverrideMetadata(typeof(WaferRobotControl), new FrameworkPropertyMetadata(typeof(WaferRobotControl)));
		}

		public static readonly DependencyProperty WaferProperty = DependencyProperty.Register("Wafer", typeof(int), typeof(WaferRobotControl));
		public int Wafer { get => (int)GetValue(WaferProperty); set => SetValue(WaferProperty, value); }

		public static readonly DependencyProperty RobotWActionProperty = DependencyProperty.Register(
		   "RobotWAction",
		   typeof(WaferRobotWAction),
		   typeof(WaferRobotControl),
		   new PropertyMetadata(WaferRobotWAction.W_Origin, RobotWActionPropertyChangedCallback));

		public WaferRobotWAction RobotWAction
		{
			get => (WaferRobotWAction)GetValue(RobotWActionProperty);
			set => SetValue(RobotWActionProperty, value);
		}

		private static void RobotWActionPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
		{
			var control = d as WaferRobotControl;
			var oldAct = (WaferRobotWAction)e.OldValue;
			var newAct = (WaferRobotWAction)e.NewValue;
			switch (newAct)
			{
				case WaferRobotWAction.W_Origin:
					VisualStateManager.GoToState(control, newAct.ToString(), true);
					break;
				case WaferRobotWAction.W_StickOut:
					if (newAct != oldAct)
					{
						VisualStateManager.GoToState(control, newAct.ToString(), true);
					}
					break;
				default:
					break;
			}
		}

		public static readonly DependencyProperty RobotRActionProperty = DependencyProperty.Register(
			"RobotRAction",
			typeof(WaferRobotRAction),
			typeof(WaferRobotControl),
			new PropertyMetadata(WaferRobotRAction.R_Origin, RobotRActionPropertyChangedCallback));
		public WaferRobotRAction RobotRAction
		{
			get => (WaferRobotRAction)GetValue(RobotRActionProperty);
			set => SetValue(RobotRActionProperty, value);
		}

		private static void RobotRActionPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
		{
			var control = d as WaferRobotControl;
			var oldAct = (WaferRobotRAction)e.OldValue;
			var newAct = (WaferRobotRAction)e.NewValue;
			switch (newAct)
			{
				case WaferRobotRAction.R_Origin:
					VisualStateManager.GoToState(control, newAct.ToString(), true);
					break;
				case WaferRobotRAction.R_StickOut:
					if (newAct != oldAct)
					{
						VisualStateManager.GoToState(control, newAct.ToString(), true);
					}
					break;
				default:
					break;
			}
		}



		public static readonly DependencyProperty RobotTActionProperty = DependencyProperty.Register(
			"RobotTAction",
			typeof(WaferRobotTAction),
			typeof(WaferRobotControl),
			new PropertyMetadata(WaferRobotTAction.T_Origin, RobotTActionPropertyChangedCallback));

		public WaferRobotTAction RobotTAction
		{
			get => (WaferRobotTAction)GetValue(RobotTActionProperty);
			set => SetValue(RobotTActionProperty, value);
		}

		private static void RobotTActionPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
		{
			var control = d as WaferRobotControl;
			var oldAct = (WaferRobotTAction)e.OldValue;
			var newAct = (WaferRobotTAction)e.NewValue;
			switch (newAct)
			{
				case WaferRobotTAction.T_Origin:
					VisualStateManager.GoToState(control, newAct.ToString(), true);
					break;
				case WaferRobotTAction.T_CW:
					if (newAct != oldAct)
					{
						VisualStateManager.GoToState(control, newAct.ToString(), true);
					}
					break;
				case WaferRobotTAction.T_CCW:
					if (newAct != oldAct)
					{
						VisualStateManager.GoToState(control, newAct.ToString(), true);
					}
					break;
				default:
					break;
			}
		}

		public override void OnApplyTemplate()
		{
			base.OnApplyTemplate();
			VisualStateManager.GoToState(this, WaferRobotWAction.W_Origin.ToString(), true);
			VisualStateManager.GoToState(this, WaferRobotRAction.R_Origin.ToString(), true);
			VisualStateManager.GoToState(this, WaferRobotTAction.T_Origin.ToString(), true);
		}
	}
}

2.机械手手臂(轴)状态

public enum WaferRobotRAction
{
	R_Origin,
	R_StickOut
}
public enum WaferRobotWAction
{
	W_Origin,
	W_StickOut
}
public enum WaferRobotTAction
{
	T_Origin,
	T_CW,
	T_CCW
}

3.控件对应的模版


使用:

private void TCWButton_Click(object sender, RoutedEventArgs e)
{
	robot.RobotTAction = WaferRobotTAction.T_CW;
}

通过方法里改变控件对象的属性就可以改变控件的现实状态;
 

你可能感兴趣的:(wpf)