初版本AxisControl(Viscom风格)控件。
This commit is contained in:
@@ -0,0 +1,237 @@
|
||||
<UserControl x:Class="XP.Hardware.MotionControl.Views.AxisControlView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:loc="clr-namespace:XP.Common.Localization.Extensions;assembly=XP.Common"
|
||||
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
|
||||
xmlns:prism="http://prismlibrary.com/"
|
||||
xmlns:controls="clr-namespace:XP.Common.Controls;assembly=XP.Common"
|
||||
prism:ViewModelLocator.AutoWireViewModel="True"
|
||||
mc:Ignorable="d"
|
||||
HorizontalAlignment="Stretch" Background="White">
|
||||
|
||||
<Grid Margin="8">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" MinWidth="200"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- ========== 左侧区域:轴位置 + 安全参数 | Left: Axis Positions + Safety Params ========== -->
|
||||
<StackPanel Grid.Column="0" Margin="0,0,8,0">
|
||||
|
||||
<!-- 轴位置输入框组 | Axis Position Inputs -->
|
||||
<GroupBox Margin="0,0,0,6">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="{loc:Localization AC_AxisPositions}" FontWeight="Bold" FontSize="12"/>
|
||||
</GroupBox.Header>
|
||||
<Grid Margin="5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" MinWidth="80"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Stage X -->
|
||||
<TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Localization AC_StageX}"
|
||||
FontSize="12" VerticalAlignment="Center" Margin="0,2"/>
|
||||
<telerik:RadNumericUpDown Grid.Row="0" Grid.Column="1" x:Name="NumStageX"
|
||||
Value="{Binding StageXPosition, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
ValueFormat="Numeric" NumberDecimalDigits="2" SmallChange="0.1" IsEditable="True"
|
||||
GotFocus="NumStageX_GotFocus" LostFocus="NumStageX_LostFocus" KeyDown="NumStageX_KeyDown"
|
||||
Margin="4,2" telerik:StyleManager.Theme="Crystal"/>
|
||||
|
||||
<!-- Stage Y -->
|
||||
<TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Localization AC_StageY}"
|
||||
FontSize="12" VerticalAlignment="Center" Margin="0,2"/>
|
||||
<telerik:RadNumericUpDown Grid.Row="1" Grid.Column="1" x:Name="NumStageY"
|
||||
Value="{Binding StageYPosition, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
ValueFormat="Numeric" NumberDecimalDigits="2" SmallChange="0.1" IsEditable="True"
|
||||
GotFocus="NumStageY_GotFocus" LostFocus="NumStageY_LostFocus" KeyDown="NumStageY_KeyDown"
|
||||
Margin="4,2" telerik:StyleManager.Theme="Crystal"/>
|
||||
|
||||
<!-- Source Z -->
|
||||
<TextBlock Grid.Row="2" Grid.Column="0" Text="{loc:Localization AC_SourceZ}"
|
||||
FontSize="12" VerticalAlignment="Center" Margin="0,2"/>
|
||||
<telerik:RadNumericUpDown Grid.Row="2" Grid.Column="1" x:Name="NumSourceZ"
|
||||
Value="{Binding SourceZPosition, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
ValueFormat="Numeric" NumberDecimalDigits="2" SmallChange="0.1" IsEditable="True"
|
||||
GotFocus="NumSourceZ_GotFocus" LostFocus="NumSourceZ_LostFocus" KeyDown="NumSourceZ_KeyDown"
|
||||
Margin="4,2" telerik:StyleManager.Theme="Crystal"/>
|
||||
|
||||
<!-- Detector Z -->
|
||||
<TextBlock Grid.Row="3" Grid.Column="0" Text="{loc:Localization AC_DetectorZ}"
|
||||
FontSize="12" VerticalAlignment="Center" Margin="0,2"/>
|
||||
<telerik:RadNumericUpDown Grid.Row="3" Grid.Column="1" x:Name="NumDetectorZ"
|
||||
Value="{Binding DetectorZPosition, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
ValueFormat="Numeric" NumberDecimalDigits="2" SmallChange="0.1" IsEditable="True"
|
||||
GotFocus="NumDetectorZ_GotFocus" LostFocus="NumDetectorZ_LostFocus" KeyDown="NumDetectorZ_KeyDown"
|
||||
Margin="4,2" telerik:StyleManager.Theme="Crystal"/>
|
||||
|
||||
<!-- Detector Swing(动态显示/隐藏)| Dynamic visibility -->
|
||||
<TextBlock Grid.Row="4" Grid.Column="0" Text="{loc:Localization AC_DetectorSwing}"
|
||||
FontSize="12" VerticalAlignment="Center" Margin="0,2"
|
||||
Visibility="{Binding DetectorSwingVisibility}"/>
|
||||
<telerik:RadNumericUpDown Grid.Row="4" Grid.Column="1" x:Name="NumDetSwing"
|
||||
Value="{Binding DetectorSwingAngle, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
ValueFormat="Numeric" NumberDecimalDigits="2" SmallChange="0.1" IsEditable="True"
|
||||
GotFocus="NumDetSwing_GotFocus" LostFocus="NumDetSwing_LostFocus" KeyDown="NumDetSwing_KeyDown"
|
||||
Visibility="{Binding DetectorSwingVisibility}"
|
||||
Margin="4,2" telerik:StyleManager.Theme="Crystal"/>
|
||||
|
||||
<!-- Stage Rotation(动态显示/隐藏)| Dynamic visibility -->
|
||||
<TextBlock Grid.Row="5" Grid.Column="0" Text="{loc:Localization AC_StageRotation}"
|
||||
FontSize="12" VerticalAlignment="Center" Margin="0,2"
|
||||
Visibility="{Binding StageRotationVisibility}"/>
|
||||
<telerik:RadNumericUpDown Grid.Row="5" Grid.Column="1" x:Name="NumStageRot"
|
||||
Value="{Binding StageRotationAngle, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
ValueFormat="Numeric" NumberDecimalDigits="2" SmallChange="0.1" IsEditable="True"
|
||||
GotFocus="NumStageRot_GotFocus" LostFocus="NumStageRot_LostFocus" KeyDown="NumStageRot_KeyDown"
|
||||
Visibility="{Binding StageRotationVisibility}"
|
||||
Margin="4,2" telerik:StyleManager.Theme="Crystal"/>
|
||||
|
||||
<!-- Fixture Rotation(动态显示/隐藏)| Dynamic visibility -->
|
||||
<TextBlock Grid.Row="6" Grid.Column="0" Text="{loc:Localization AC_FixtureRotation}"
|
||||
FontSize="12" VerticalAlignment="Center" Margin="0,2"
|
||||
Visibility="{Binding FixtureRotationVisibility}"/>
|
||||
<telerik:RadNumericUpDown Grid.Row="6" Grid.Column="1" x:Name="NumFixtureRot"
|
||||
Value="{Binding FixtureRotationAngle, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
ValueFormat="Numeric" NumberDecimalDigits="2" SmallChange="0.1" IsEditable="True"
|
||||
GotFocus="NumFixtureRot_GotFocus" LostFocus="NumFixtureRot_LostFocus" KeyDown="NumFixtureRot_KeyDown"
|
||||
Visibility="{Binding FixtureRotationVisibility}"
|
||||
Margin="4,2" telerik:StyleManager.Theme="Crystal"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<!-- 安全参数输入框组 | Safety Parameter Inputs -->
|
||||
<GroupBox Margin="0,0,0,6">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="{loc:Localization AC_SafetyParams}" FontWeight="Bold" FontSize="12"/>
|
||||
</GroupBox.Header>
|
||||
<Grid Margin="5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" MinWidth="80"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- 安全高度 | Safety Height -->
|
||||
<TextBlock Grid.Row="0" Grid.Column="0" Text="{loc:Localization AC_SafetyHeight}"
|
||||
FontSize="12" VerticalAlignment="Center" Margin="0,2"/>
|
||||
<telerik:RadNumericUpDown Grid.Row="0" Grid.Column="1" x:Name="NumSafetyHeight"
|
||||
Value="{Binding SafetyHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
ValueFormat="Numeric" NumberDecimalDigits="2" SmallChange="0.1" IsEditable="True"
|
||||
KeyDown="NumSafetyHeight_KeyDown"
|
||||
Margin="4,2" telerik:StyleManager.Theme="Crystal"/>
|
||||
|
||||
<!-- 校准计算值 | Calibration Value -->
|
||||
<TextBlock Grid.Row="1" Grid.Column="0" Text="{loc:Localization AC_CalibrationValue}"
|
||||
FontSize="12" VerticalAlignment="Center" Margin="0,2"/>
|
||||
<telerik:RadNumericUpDown Grid.Row="1" Grid.Column="1" x:Name="NumCalibration"
|
||||
Value="{Binding CalibrationValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
|
||||
ValueFormat="Numeric" NumberDecimalDigits="2" SmallChange="0.1" IsEditable="True"
|
||||
KeyDown="NumCalibration_KeyDown"
|
||||
Margin="4,2" telerik:StyleManager.Theme="Crystal"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<!-- 错误信息显示 | Error Message Display -->
|
||||
<TextBlock Text="{Binding ErrorMessage}" FontSize="11" Foreground="#FFE53935"
|
||||
TextWrapping="Wrap" Margin="0,2">
|
||||
<TextBlock.Style>
|
||||
<Style TargetType="TextBlock">
|
||||
<Setter Property="Visibility" Value="Visible"/>
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding ErrorMessage}" Value="{x:Null}">
|
||||
<Setter Property="Visibility" Value="Collapsed"/>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding ErrorMessage}" Value="">
|
||||
<Setter Property="Visibility" Value="Collapsed"/>
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</TextBlock.Style>
|
||||
</TextBlock>
|
||||
</StackPanel>
|
||||
|
||||
<!-- ========== 右侧区域:摇杆 + 操作按钮 | Right: Joysticks + Action Buttons ========== -->
|
||||
<Grid Grid.Column="1">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- 摇杆区域 | Joystick Area -->
|
||||
<StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
|
||||
<!-- 单轴摇杆(SingleAxisY):Source_Z / Detector_Z | Single-axis joystick -->
|
||||
<controls:VirtualJoystick x:Name="SingleJoystick"
|
||||
JoystickMode="SingleAxisY"
|
||||
Width="150" Height="200"
|
||||
IsEnabled="{Binding IsJoystickEnabled}"
|
||||
DefaultTopIcon="↑" DefaultBottomIcon="↓"
|
||||
LeftButtonTopIcon="Src↑" LeftButtonBottomIcon="Src↓"
|
||||
RightButtonTopIcon="Det↑" RightButtonBottomIcon="Det↓"
|
||||
Margin="0,0,16,0"/>
|
||||
|
||||
<!-- 双轴摇杆(DualAxis):Stage X/Y + Swing/Rotation | Dual-axis joystick -->
|
||||
<controls:VirtualJoystick x:Name="DualJoystick"
|
||||
JoystickMode="DualAxis"
|
||||
Width="200" Height="200"
|
||||
IsEnabled="{Binding IsJoystickEnabled}"
|
||||
DefaultTopIcon="↑" DefaultBottomIcon="↓" DefaultLeftIcon="←" DefaultRightIcon="→"
|
||||
LeftButtonTopIcon="Y+" LeftButtonBottomIcon="Y-" LeftButtonLeftIcon="X-" LeftButtonRightIcon="X+"
|
||||
RightButtonTopIcon="Rot+" RightButtonBottomIcon="Rot-" RightButtonLeftIcon="Swing-" RightButtonRightIcon="Swing+"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- 操作按钮区域 | Action Buttons Area -->
|
||||
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,8,0,0">
|
||||
|
||||
<!-- 使能开关 | Enable Toggle -->
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Margin="0,0,12,0">
|
||||
<TextBlock Text="{loc:Localization AC_Enable}" FontSize="12" VerticalAlignment="Center" Margin="0,0,6,0"/>
|
||||
<telerik:RadToggleSwitchButton IsChecked="{Binding IsJoystickEnabled, Mode=TwoWay}"
|
||||
Command="{Binding ToggleEnableCommand}"
|
||||
telerik:StyleManager.Theme="Crystal"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- 保存按钮 | Save Button -->
|
||||
<telerik:RadButton Content="{loc:Localization AC_Save}"
|
||||
Command="{Binding SavePositionsCommand}"
|
||||
Width="70" Height="28" Margin="4,0" FontSize="12"
|
||||
telerik:StyleManager.Theme="Crystal">
|
||||
<telerik:RadButton.Background>
|
||||
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
|
||||
<GradientStop Color="White"/>
|
||||
<GradientStop Color="#FF62B8E0" Offset="1"/>
|
||||
</LinearGradientBrush>
|
||||
</telerik:RadButton.Background>
|
||||
</telerik:RadButton>
|
||||
|
||||
<!-- 恢复按钮 | Restore Button -->
|
||||
<telerik:RadButton Content="{loc:Localization AC_Restore}"
|
||||
Command="{Binding RestorePositionsCommand}"
|
||||
Width="70" Height="28" Margin="4,0" FontSize="12"
|
||||
telerik:StyleManager.Theme="Crystal">
|
||||
<telerik:RadButton.Background>
|
||||
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
|
||||
<GradientStop Color="White"/>
|
||||
<GradientStop Color="#FFFFD54F" Offset="1"/>
|
||||
</LinearGradientBrush>
|
||||
</telerik:RadButton.Background>
|
||||
</telerik:RadButton>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -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