偶然的机会想做一个双手臂运转的机械手动作动画,重要的是有前辈写好的可以模仿: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;
}
通过方法里改变控件对象的属性就可以改变控件的现实状态;