235 lines
8.3 KiB
C#
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
|
|
}
|
|
}
|