Files
XplorePlane/XP.Hardware.MotionControl/Views/AxisControlView.xaml.cs
T
2026-04-22 20:48:00 +08:00

235 lines
8.3 KiB
C#

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
}
}