using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using Telerik.Windows.Controls; using XP.Hardware.RaySource.ViewModels; namespace XP.Hardware.RaySource.Views { /// /// 射线源操作视图 code-behind | X-Ray Source Operate View code-behind /// 负责将滑块 DragCompleted / 输入框确认操作桥接到 ViewModel 命令 /// Bridges slider DragCompleted / numeric confirm actions to ViewModel commands /// public partial class RaySourceOperateView : UserControl { // 防止初始化阶段触发写入 | Prevent writes during initialization private bool _isLoaded = false; // 标记输入框是否正在键盘输入中(区分手动输入和箭头点击) // Flag whether numeric input is in keyboard editing (distinguish manual input from arrow click) private bool _isVoltageEditing = false; private bool _isCurrentEditing = false; public RaySourceOperateView() { InitializeComponent(); // 滑块拖动完成时提交值到硬件 | Apply value to hardware when slider drag completes VoltageSlider.DragCompleted += VoltageSlider_DragCompleted; CurrentSlider.DragCompleted += CurrentSlider_DragCompleted; // 输入框事件 | Numeric input events VoltageNumeric.GotKeyboardFocus += (s, e) => _isVoltageEditing = true; VoltageNumeric.LostFocus += VoltageNumeric_LostFocus; VoltageNumeric.KeyDown += VoltageNumeric_KeyDown; VoltageNumeric.ValueChanged += VoltageNumeric_ValueChanged; CurrentNumeric.GotKeyboardFocus += (s, e) => _isCurrentEditing = true; CurrentNumeric.LostFocus += CurrentNumeric_LostFocus; CurrentNumeric.KeyDown += CurrentNumeric_KeyDown; CurrentNumeric.ValueChanged += CurrentNumeric_ValueChanged; Loaded += OnViewLoaded; Unloaded += OnViewUnloaded; } /// /// 界面加载完成:标记已加载并触发自动初始化流程 /// View loaded: mark as loaded and trigger auto-initialization sequence /// 参考旧代码 AreaDetector_Load 模式 | Follows AreaDetector_Load pattern from legacy code /// private async void OnViewLoaded(object sender, RoutedEventArgs e) { _isLoaded = true; if (DataContext is RaySourceOperateViewModel vm) { await vm.AutoInitializeAsync(); } } /// /// 界面卸载:触发 ViewModel 的 Dispose 执行断开操作 /// View unloaded: trigger ViewModel Dispose to execute disconnect /// private void OnViewUnloaded(object sender, RoutedEventArgs e) { if (DataContext is RaySourceOperateViewModel vm) { vm.Dispose(); } } /// /// 判断是否可以提交(已加载、非设备反馈更新中)| Check if can apply (loaded and not updating from device) /// private bool CanApply(out RaySourceOperateViewModel vm) { vm = null; if (!_isLoaded) return false; if (DataContext is not RaySourceOperateViewModel viewModel) return false; if (viewModel.IsUpdatingFromDevice) return false; vm = viewModel; return true; } #region 滑块事件 | Slider Events /// /// 电压滑块拖动完成 | Voltage slider drag completed /// private void VoltageSlider_DragCompleted(object sender, RadDragCompletedEventArgs e) { if (CanApply(out var vm)) vm.ApplyVoltageCommand.Execute(); } /// /// 电流滑块拖动完成 | Current slider drag completed /// private void CurrentSlider_DragCompleted(object sender, RadDragCompletedEventArgs e) { if (CanApply(out var vm)) vm.ApplyCurrentCommand.Execute(); } #endregion #region 电压输入框事件 | Voltage Numeric Events /// /// 电压输入框值变更:仅在非键盘编辑时提交(即箭头按钮点击) /// Voltage numeric value changed: only apply when not keyboard editing (i.e. arrow button click) /// private void VoltageNumeric_ValueChanged(object sender, RadRangeBaseValueChangedEventArgs e) { if (!_isVoltageEditing && CanApply(out var vm)) vm.ApplyVoltageCommand.Execute(); } /// /// 电压输入框回车确认 | Voltage numeric Enter key confirm /// private void VoltageNumeric_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter && CanApply(out var vm)) { _isVoltageEditing = false; vm.ApplyVoltageCommand.Execute(); } } /// /// 电压输入框失焦确认 | Voltage numeric lost focus confirm /// private void VoltageNumeric_LostFocus(object sender, RoutedEventArgs e) { if (_isVoltageEditing && CanApply(out var vm)) { _isVoltageEditing = false; vm.ApplyVoltageCommand.Execute(); } } #endregion #region 电流输入框事件 | Current Numeric Events /// /// 电流输入框值变更:仅在非键盘编辑时提交(即箭头按钮点击) /// Current numeric value changed: only apply when not keyboard editing (i.e. arrow button click) /// private void CurrentNumeric_ValueChanged(object sender, RadRangeBaseValueChangedEventArgs e) { if (!_isCurrentEditing && CanApply(out var vm)) vm.ApplyCurrentCommand.Execute(); } /// /// 电流输入框回车确认 | Current numeric Enter key confirm /// private void CurrentNumeric_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter && CanApply(out var vm)) { _isCurrentEditing = false; vm.ApplyCurrentCommand.Execute(); } } /// /// 电流输入框失焦确认 | Current numeric lost focus confirm /// private void CurrentNumeric_LostFocus(object sender, RoutedEventArgs e) { if (_isCurrentEditing && CanApply(out var vm)) { _isCurrentEditing = false; vm.ApplyCurrentCommand.Execute(); } } #endregion } }