初版本AxisControl(Viscom风格)控件。
This commit is contained in:
@@ -0,0 +1,234 @@
|
||||
using System.ComponentModel;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using XP.Common.Controls;
|
||||
using XP.Hardware.MotionControl.ViewModels;
|
||||
|
||||
namespace XP.Hardware.MotionControl.Views
|
||||
{
|
||||
/// <summary>
|
||||
/// 轴控制面板视图 | Axis Control Panel View
|
||||
/// 集成摇杆、轴位置输入框、安全参数和使能控制的 UserControl
|
||||
/// UserControl integrating joysticks, axis position inputs, safety parameters and enable control
|
||||
/// </summary>
|
||||
public partial class AxisControlView : UserControl
|
||||
{
|
||||
public AxisControlView()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
// 监听摇杆只读依赖属性变化,推送到 ViewModel | Listen to joystick read-only DP changes and push to ViewModel
|
||||
var dualOutputXDesc = DependencyPropertyDescriptor.FromProperty(VirtualJoystick.OutputXProperty, typeof(VirtualJoystick));
|
||||
var dualOutputYDesc = DependencyPropertyDescriptor.FromProperty(VirtualJoystick.OutputYProperty, typeof(VirtualJoystick));
|
||||
var dualButtonDesc = DependencyPropertyDescriptor.FromProperty(VirtualJoystick.ActiveMouseButtonProperty, typeof(VirtualJoystick));
|
||||
var singleOutputYDesc = DependencyPropertyDescriptor.FromProperty(VirtualJoystick.OutputYProperty, typeof(VirtualJoystick));
|
||||
var singleButtonDesc = DependencyPropertyDescriptor.FromProperty(VirtualJoystick.ActiveMouseButtonProperty, typeof(VirtualJoystick));
|
||||
|
||||
dualOutputXDesc?.AddValueChanged(DualJoystick, (s, e) =>
|
||||
{
|
||||
if (ViewModel != null) ViewModel.DualJoystickOutputX = DualJoystick.OutputX;
|
||||
});
|
||||
dualOutputYDesc?.AddValueChanged(DualJoystick, (s, e) =>
|
||||
{
|
||||
if (ViewModel != null) ViewModel.DualJoystickOutputY = DualJoystick.OutputY;
|
||||
});
|
||||
dualButtonDesc?.AddValueChanged(DualJoystick, (s, e) =>
|
||||
{
|
||||
if (ViewModel != null) ViewModel.DualJoystickActiveButton = DualJoystick.ActiveMouseButton;
|
||||
});
|
||||
singleOutputYDesc?.AddValueChanged(SingleJoystick, (s, e) =>
|
||||
{
|
||||
if (ViewModel != null) ViewModel.SingleJoystickOutputY = SingleJoystick.OutputY;
|
||||
});
|
||||
singleButtonDesc?.AddValueChanged(SingleJoystick, (s, e) =>
|
||||
{
|
||||
if (ViewModel != null) ViewModel.SingleJoystickActiveButton = SingleJoystick.ActiveMouseButton;
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前 ViewModel 实例 | Get current ViewModel instance
|
||||
/// </summary>
|
||||
private AxisControlViewModel ViewModel => DataContext as AxisControlViewModel;
|
||||
|
||||
#region Stage X 事件处理 | Stage X Event Handlers
|
||||
|
||||
private void NumStageX_GotFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.SetEditing(nameof(AxisControlViewModel.StageXPosition), true);
|
||||
}
|
||||
|
||||
private void NumStageX_LostFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.CancelEditing(nameof(AxisControlViewModel.StageXPosition));
|
||||
}
|
||||
|
||||
private void NumStageX_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
HandleAxisKeyDown(nameof(AxisControlViewModel.StageXPosition), e);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Stage Y 事件处理 | Stage Y Event Handlers
|
||||
|
||||
private void NumStageY_GotFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.SetEditing(nameof(AxisControlViewModel.StageYPosition), true);
|
||||
}
|
||||
|
||||
private void NumStageY_LostFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.CancelEditing(nameof(AxisControlViewModel.StageYPosition));
|
||||
}
|
||||
|
||||
private void NumStageY_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
HandleAxisKeyDown(nameof(AxisControlViewModel.StageYPosition), e);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Source Z 事件处理 | Source Z Event Handlers
|
||||
|
||||
private void NumSourceZ_GotFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.SetEditing(nameof(AxisControlViewModel.SourceZPosition), true);
|
||||
}
|
||||
|
||||
private void NumSourceZ_LostFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.CancelEditing(nameof(AxisControlViewModel.SourceZPosition));
|
||||
}
|
||||
|
||||
private void NumSourceZ_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
HandleAxisKeyDown(nameof(AxisControlViewModel.SourceZPosition), e);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Detector Z 事件处理 | Detector Z Event Handlers
|
||||
|
||||
private void NumDetectorZ_GotFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.SetEditing(nameof(AxisControlViewModel.DetectorZPosition), true);
|
||||
}
|
||||
|
||||
private void NumDetectorZ_LostFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.CancelEditing(nameof(AxisControlViewModel.DetectorZPosition));
|
||||
}
|
||||
|
||||
private void NumDetectorZ_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
HandleAxisKeyDown(nameof(AxisControlViewModel.DetectorZPosition), e);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Detector Swing 事件处理 | Detector Swing Event Handlers
|
||||
|
||||
private void NumDetSwing_GotFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.SetEditing(nameof(AxisControlViewModel.DetectorSwingAngle), true);
|
||||
}
|
||||
|
||||
private void NumDetSwing_LostFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.CancelEditing(nameof(AxisControlViewModel.DetectorSwingAngle));
|
||||
}
|
||||
|
||||
private void NumDetSwing_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
HandleAxisKeyDown(nameof(AxisControlViewModel.DetectorSwingAngle), e);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Stage Rotation 事件处理 | Stage Rotation Event Handlers
|
||||
|
||||
private void NumStageRot_GotFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.SetEditing(nameof(AxisControlViewModel.StageRotationAngle), true);
|
||||
}
|
||||
|
||||
private void NumStageRot_LostFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.CancelEditing(nameof(AxisControlViewModel.StageRotationAngle));
|
||||
}
|
||||
|
||||
private void NumStageRot_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
HandleAxisKeyDown(nameof(AxisControlViewModel.StageRotationAngle), e);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Fixture Rotation 事件处理 | Fixture Rotation Event Handlers
|
||||
|
||||
private void NumFixtureRot_GotFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.SetEditing(nameof(AxisControlViewModel.FixtureRotationAngle), true);
|
||||
}
|
||||
|
||||
private void NumFixtureRot_LostFocus(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ViewModel?.CancelEditing(nameof(AxisControlViewModel.FixtureRotationAngle));
|
||||
}
|
||||
|
||||
private void NumFixtureRot_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
HandleAxisKeyDown(nameof(AxisControlViewModel.FixtureRotationAngle), e);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 安全参数键盘事件 | Safety Parameter Key Events
|
||||
|
||||
private void NumSafetyHeight_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.Key == Key.Enter)
|
||||
{
|
||||
ViewModel?.ConfirmSafetyHeight();
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void NumCalibration_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (e.Key == Key.Enter)
|
||||
{
|
||||
ViewModel?.ConfirmCalibrationValue();
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 通用键盘处理 | Common Key Handler
|
||||
|
||||
/// <summary>
|
||||
/// 轴输入框通用键盘处理:Enter 确认,Escape 取消 | Common axis input key handler: Enter to confirm, Escape to cancel
|
||||
/// </summary>
|
||||
private void HandleAxisKeyDown(string propertyName, KeyEventArgs e)
|
||||
{
|
||||
if (ViewModel == null) return;
|
||||
|
||||
switch (e.Key)
|
||||
{
|
||||
case Key.Enter:
|
||||
ViewModel.ConfirmPosition(propertyName);
|
||||
e.Handled = true;
|
||||
break;
|
||||
case Key.Escape:
|
||||
ViewModel.CancelEditing(propertyName);
|
||||
e.Handled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user