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 { /// /// 轴控制面板视图 | Axis Control Panel View /// 集成摇杆、轴位置输入框、安全参数和使能控制的 UserControl /// UserControl integrating joysticks, axis position inputs, safety parameters and enable control /// 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; }); } /// /// 获取当前 ViewModel 实例 | Get current ViewModel instance /// 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 /// /// 轴输入框通用键盘处理:Enter 确认,Escape 取消 | Common axis input key handler: Enter to confirm, Escape to cancel /// 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 } }