将Feature/XP.Common和Feature/XP.Hardware分支合并至Develop/XP.forHardwareAndCommon,完善XPapp注册和相关硬件类库通用类库功能。

This commit is contained in:
QI Mingxuan
2026-04-16 17:31:13 +08:00
parent 6ec4c3ddaa
commit 2bd6e566c3
581 changed files with 74600 additions and 222 deletions
@@ -0,0 +1,140 @@
<UserControl x:Class="XP.Hardware.Detector.Views.DetectorConfigView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:prism="http://prismlibrary.com/"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:loc="clr-namespace:XP.Common.Localization.Extensions;assembly=XP.Common"
mc:Ignorable="d"
d:DesignWidth="420" d:DesignHeight="210"
prism:ViewModelLocator.AutoWireViewModel="True"
Background="White">
<Grid Margin="15">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 第1行:灵敏度 + 帧率 | Row 1: Sensitivity (PGA) + Frame rate -->
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{loc:Localization Detector_SensitivityLabel}"
FontSize="12" Foreground="#616161" VerticalAlignment="Center" Width="60"/>
<telerik:RadComboBox Grid.Column="1"
ItemsSource="{Binding PgaItems}"
SelectedItem="{Binding SelectedPga, Mode=TwoWay}"
Height="26" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal"/>
<TextBlock Grid.Column="3" Text="{loc:Localization Detector_FrameRateLabel}"
FontSize="12" Foreground="#616161" VerticalAlignment="Center" Width="60"/>
<telerik:RadNumericUpDown Grid.Column="4"
Value="{Binding FrameRate, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"
Minimum="{Binding FrameRateMinimum}"
Maximum="{Binding FrameRateMaximum}"
NumberDecimalDigits="2"
SmallChange="0.1"
Height="26" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal"/>
</Grid>
<!-- 第2行:像素合并 + 帧合并 | Row 2: Binning + Average frames -->
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{loc:Localization Detector_BinningLabel}"
FontSize="12" Foreground="#616161" VerticalAlignment="Center" Width="60"/>
<telerik:RadComboBox Grid.Column="1"
ItemsSource="{Binding BinningItems}"
DisplayMemberPath="DisplayName"
SelectedIndex="{Binding SelectedBinningIndex, Mode=TwoWay}"
Height="26" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal"/>
<TextBlock Grid.Column="3" Text="{loc:Localization Detector_AvgFramesLabel}"
FontSize="12" Foreground="#616161" VerticalAlignment="Center" Width="60"/>
<telerik:RadNumericUpDown Grid.Column="4"
Value="{Binding AvgFrames, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"
Minimum="1"
Maximum="100"
NumberDecimalDigits="0"
SmallChange="1"
Height="26" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal"/>
</Grid>
<!-- 第3行:应用参数按钮(右对齐占一半)| Row 3: Apply parameters button (right-aligned, half width) -->
<Grid Grid.Row="4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<telerik:RadButton Grid.Column="1"
Content="{loc:Localization Detector_ApplyParametersButton}"
Command="{Binding ApplyParametersCommand}"
Height="32" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal" Margin="4 0 0 0"/>
</Grid>
<!-- 第4行:分隔线 | Row 4: Separator -->
<Separator Grid.Row="6" Margin="0 0 0 0"/>
<!-- 第5行:暗场校正 + 亮场校正按钮 | Row 5: Dark + Light correction buttons -->
<Grid Grid.Row="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 暗场校正 | Dark correction -->
<telerik:RadButton Grid.Column="0"
Content="{loc:Localization Detector_DarkCorrectionButton}"
Command="{Binding DarkCorrectionCommand}"
Height="32" Margin="0 0 4 0" HorizontalAlignment="Stretch"
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>
<!-- 亮场校正 | Light correction -->
<telerik:RadButton Grid.Column="1"
Content="{loc:Localization Detector_LightCorrectionButton}"
Command="{Binding LightCorrectionCommand}"
Height="32" Margin="4 0 0 0" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal">
<telerik:RadButton.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White"/>
<GradientStop Color="#FF77E062" Offset="1"/>
</LinearGradientBrush>
</telerik:RadButton.Background>
</telerik:RadButton>
</Grid>
</Grid>
</UserControl>
@@ -0,0 +1,15 @@
using System.Windows.Controls;
namespace XP.Hardware.Detector.Views
{
/// <summary>
/// 面阵探测器配置视图 | Area detector configuration view
/// </summary>
public partial class DetectorConfigView : UserControl
{
public DetectorConfigView()
{
InitializeComponent();
}
}
}
@@ -0,0 +1,14 @@
<Window x:Class="XP.Hardware.Detector.Views.DetectorConfigWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:XP.Common.Localization.Extensions;assembly=XP.Common"
xmlns:detectorViews="clr-namespace:XP.Hardware.Detector.Views"
Title="{loc:Localization Detector_ConfigWindowTitle}"
Height="230" Width="400"
MinHeight="230" MinWidth="360"
WindowStartupLocation="CenterOwner"
ResizeMode="CanResize">
<Grid>
<detectorViews:DetectorConfigView />
</Grid>
</Window>
@@ -0,0 +1,24 @@
using System.Windows;
namespace XP.Hardware.Detector.Views
{
/// <summary>
/// 探测器配置窗口 | Detector config window
/// </summary>
public partial class DetectorConfigWindow : Window
{
/// <summary>
/// 构造函数 | Constructor
/// </summary>
public DetectorConfigWindow()
{
InitializeComponent();
// 继承主窗口图标 | Inherit main window icon
if (Application.Current?.MainWindow != null)
{
Icon = Application.Current.MainWindow.Icon;
}
}
}
}
@@ -0,0 +1,268 @@
<Window x:Class="XP.Hardware.Detector.Views.DetectorImageWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:prism="http://prismlibrary.com/"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:loc="clr-namespace:XP.Common.Localization.Extensions;assembly=XP.Common"
mc:Ignorable="d"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{loc:Localization Detector_ImageWindowTitle}"
Height="750" Width="850"
MinHeight="550" MinWidth="650"
WindowStartupLocation="CenterOwner"
Background="White">
<Grid Margin="10">
<Grid.ColumnDefinitions>
<!-- 左侧:图像区域 | Left: Image area -->
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="8"/>
<!-- 右侧:控制面板 | Right: Control panel -->
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<!-- ========== 左侧主区域 ========== -->
<Grid Grid.Column="0">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="8"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- 图像显示区域 | Image display area -->
<Border Grid.Row="0" BorderBrush="#E0E0E0" BorderThickness="1" Background="#1A1A1A">
<Viewbox Stretch="Uniform">
<Image Source="{Binding ImageSource}"
RenderOptions.BitmapScalingMode="NearestNeighbor"
RenderOptions.EdgeMode="Aliased"
Stretch="Uniform"/>
</Viewbox>
</Border>
<!-- 底部状态栏 | Bottom status bar -->
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="12"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<!-- 采集状态指示灯 | Acquisition status indicator -->
<StackPanel Grid.Column="0" Orientation="Horizontal">
<Ellipse Width="10" Height="10" Margin="0 0 6 0" VerticalAlignment="Center">
<Ellipse.Style>
<Style TargetType="Ellipse">
<Setter Property="Fill" Value="#9E9E9E"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsAcquiring}" Value="True">
<Setter Property="Fill" Value="#4CAF50"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
<TextBlock FontSize="12" Foreground="#616161" VerticalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="{loc:Localization Detector_StatusIdle}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsAcquiring}" Value="True">
<Setter Property="Text" Value="{loc:Localization Detector_Status_Acquiring}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
<!-- 操作状态消息 | Operation status message -->
<TextBlock Grid.Column="2" Text="{Binding StatusMessage}"
FontSize="11" Foreground="#9E9E9E" VerticalAlignment="Center"
TextTrimming="CharacterEllipsis"/>
<!-- 图像信息 | Image info -->
<TextBlock Grid.Column="3" Text="{Binding ImageInfo}"
FontSize="12" Foreground="#616161" VerticalAlignment="Center"/>
</Grid>
</Grid>
<!-- ========== 右侧控制面板 ========== -->
<Grid Grid.Column="2">
<Grid.RowDefinitions>
<!-- 连接控制 | Connection control -->
<RowDefinition Height="Auto"/>
<RowDefinition Height="12"/>
<!-- 探测器信息 | Detector info -->
<RowDefinition Height="Auto"/>
<RowDefinition Height="12"/>
<!-- 采集控制 | Acquisition control -->
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- 连接控制区 | Connection control section -->
<Border Grid.Row="0" BorderBrush="#E0E0E0" BorderThickness="1" CornerRadius="4" Padding="10">
<StackPanel>
<!-- 连接状态指示 | Connection status indicator -->
<StackPanel Orientation="Horizontal" Margin="0 0 0 8">
<Ellipse Width="10" Height="10" Margin="0 0 6 0" VerticalAlignment="Center"
Fill="{Binding ConnectionStatusColor}"/>
<TextBlock FontSize="12" Foreground="#424242" VerticalAlignment="Center">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="{loc:Localization Detector_Disconnected}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsConnected}" Value="True">
<Setter Property="Text" Value="{loc:Localization Detector_Connected}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
<!-- 连接/断开按钮 | Connect/Disconnect buttons -->
<telerik:RadButton Content="{loc:Localization Detector_ConnectButton}"
Command="{Binding ConnectCommand}"
Height="32" Margin="0 0 0 4" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal">
<telerik:RadButton.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White"/>
<GradientStop Color="#FF77E062" Offset="1"/>
</LinearGradientBrush>
</telerik:RadButton.Background>
</telerik:RadButton>
<telerik:RadButton Content="{loc:Localization Detector_DisconnectButton}"
Command="{Binding DisconnectCommand}"
Height="32" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal">
<telerik:RadButton.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White"/>
<GradientStop Color="#FFFFA1A1" Offset="1"/>
</LinearGradientBrush>
</telerik:RadButton.Background>
</telerik:RadButton>
</StackPanel>
</Border>
<!-- 探测器信息区 | Detector info section -->
<Border Grid.Row="2" BorderBrush="#E0E0E0" BorderThickness="1" CornerRadius="4" Padding="10">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="4"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="4"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="4"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="4"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- 类型 | Type -->
<TextBlock Grid.Row="0" Grid.Column="0"
Text="{loc:Localization Detector_TypeLabel}"
FontSize="12" Foreground="#757575" VerticalAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="1"
Text="{Binding DetectorTypeText}"
FontSize="12" Foreground="#212121" VerticalAlignment="Center"
HorizontalAlignment="Right"/>
<!-- 型号 | Model -->
<TextBlock Grid.Row="2" Grid.Column="0"
Text="{loc:Localization Detector_ModelLabel}"
FontSize="12" Foreground="#757575" VerticalAlignment="Center"/>
<TextBlock Grid.Row="2" Grid.Column="1"
Text="{Binding DetectorModel}"
FontSize="12" Foreground="#212121" VerticalAlignment="Center"
HorizontalAlignment="Right" TextTrimming="CharacterEllipsis"/>
<!-- 分辨率 | Resolution -->
<TextBlock Grid.Row="4" Grid.Column="0"
Text="{loc:Localization Detector_ResolutionLabel}"
FontSize="12" Foreground="#757575" VerticalAlignment="Center"/>
<TextBlock Grid.Row="4" Grid.Column="1"
Text="{Binding DetectorResolution}"
FontSize="12" Foreground="#212121" VerticalAlignment="Center"
HorizontalAlignment="Right"/>
<!-- 像素尺寸 | Pixel size -->
<TextBlock Grid.Row="6" Grid.Column="0"
Text="{loc:Localization Detector_PixelSizeLabel}"
FontSize="12" Foreground="#757575" VerticalAlignment="Center"/>
<TextBlock Grid.Row="6" Grid.Column="1"
Text="{Binding DetectorPixelSize}"
FontSize="12" Foreground="#212121" VerticalAlignment="Center"
HorizontalAlignment="Right"/>
<!-- 状态 | Status -->
<TextBlock Grid.Row="8" Grid.Column="0"
Text="{loc:Localization Detector_StatusLabel}"
FontSize="12" Foreground="#757575" VerticalAlignment="Center"/>
<TextBlock Grid.Row="8" Grid.Column="1"
Text="{Binding DetectorStatusText}"
FontSize="12" Foreground="#212121" VerticalAlignment="Center"
HorizontalAlignment="Right"/>
</Grid>
</Border>
<!-- 采集控制区 | Acquisition control section -->
<Border Grid.Row="4" BorderBrush="#E0E0E0" BorderThickness="1" CornerRadius="4" Padding="10">
<StackPanel>
<telerik:RadButton Content="{loc:Localization Detector_StartAcquisitionButton}"
Command="{Binding StartAcquisitionCommand}"
Height="32" Margin="0 0 0 4" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal">
<telerik:RadButton.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White"/>
<GradientStop Color="#FF77E062" Offset="1"/>
</LinearGradientBrush>
</telerik:RadButton.Background>
</telerik:RadButton>
<telerik:RadButton Content="{loc:Localization Detector_StopAcquisitionButton}"
Command="{Binding StopAcquisitionCommand}"
Height="32" Margin="0 0 0 4" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal">
<telerik:RadButton.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="White"/>
<GradientStop Color="#FFFFA1A1" Offset="1"/>
</LinearGradientBrush>
</telerik:RadButton.Background>
</telerik:RadButton>
<telerik:RadButton Content="{loc:Localization Detector_SingleFrameButton}"
Command="{Binding SingleFrameCommand}"
Height="32" HorizontalAlignment="Stretch"
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>
<Separator Margin="0,8,0,4"/>
<telerik:RadButton Content="{loc:Localization Detector_SaveImageButton}"
Command="{Binding SaveImageCommand}"
Height="32" Margin="0 4 0 0" HorizontalAlignment="Stretch"
telerik:StyleManager.Theme="Crystal"/>
</StackPanel>
</Border>
</Grid>
</Grid>
</Window>
@@ -0,0 +1,24 @@
using System.Windows;
namespace XP.Hardware.Detector.Views
{
/// <summary>
/// 探测器图像显示窗口 | Detector image display window
/// </summary>
public partial class DetectorImageWindow : Window
{
/// <summary>
/// 构造函数 | Constructor
/// </summary>
public DetectorImageWindow()
{
InitializeComponent();
// 继承主窗口图标 | Inherit main window icon
if (Application.Current?.MainWindow != null)
{
Icon = Application.Current.MainWindow.Icon;
}
}
}
}