Bläddra i källkod

修改开关限位逻辑

LC 2 månader sedan
förälder
incheckning
71a51bbe9e

+ 6 - 1
App.xaml

@@ -8,6 +8,7 @@
         <ResourceDictionary>
             <FontFamily x:Key="PuHuiTiBold">pack://application:,,,/SWRIS;component/Fonts/Alibaba-PuHuiTi-Bold.ttf#Alibaba PuHuiTi</FontFamily>
             <FontFamily x:Key="PuHuiTiRegular">pack://application:,,,/SWRIS;component/Fonts/Alibaba-PuHuiTi-Regular.ttf#Alibaba PuHuiTi</FontFamily>
+            <FontFamily x:Key="PuHuiTiMedium">pack://application:,,,/SWRIS;component/Fonts/Alibaba-PuHuiTi-Medium.ttf#Alibaba PuHuiTi</FontFamily>
             <FontFamily x:Key="PanuonIconFont">pack://application:,,,/SWRIS;component/Fonts/PanuonIcon.ttf#PanuonIcon</FontFamily>
             <ResourceDictionary.MergedDictionaries>
                 <pu:StyleDictionary Includes="All" />
@@ -21,7 +22,11 @@
                                 <Setter Property="Height" Value="320" />
                                 <Setter Property="FontSize" Value="22"/>
                                 <Setter Property="FontWeight" Value="Medium"/>
-                                <Setter Property="FontFamily" Value="{StaticResource PuHuiTiRegular}"/>
+                                <Setter Property="FontFamily">
+                                    <Setter.Value>
+                                        <FontFamily>pack://application:,,,/SWRIS;component/Fonts/Alibaba-PuHuiTi-Medium.ttf#Alibaba PuHuiTi</FontFamily>
+                                    </Setter.Value>
+                                </Setter>
                                 <Setter Property="Background" Value="#141332" />
                                 <Setter Property="Foreground" Value="#FFFFFF" />
                                 <Setter Property="BorderBrush" Value="#615CDD"/>

+ 12 - 1
Config/Config.json

@@ -2,7 +2,7 @@
   "AppName": "在线式钢丝绳电磁检测系统",
   "Version": "250902",
   "Copyright": "河南恒达机电设备有限公司",
-  "IpAddress": "192.168.1.127",
+  "IpAddress": "127.0.0.1",
   "Port": 9005,
   "DataSaveDays": 120,
   "CleanScheduledTime": "02:00:00",
@@ -21,6 +21,17 @@
         "Address": "I8.0",
         "Position": 0.0,
         "IsEnable": true,
+        "Function": "X1",
+        "SwitchIndex": 1,
+        "RelatedRopes": [ 1, 2 ]
+      },
+      {
+        "Name": "下预限",
+        "Address": "I8.1",
+        "Position": 0.0,
+        "IsEnable": true,
+        "Function": "X2",
+        "SwitchIndex": 2,
         "RelatedRopes": [ 1, 2 ]
       }
     ],

+ 14 - 6
Core/TcpServerFrame.cs

@@ -1,5 +1,4 @@
-using ScottPlot.Colormaps;
-using SWRIS.Enums;
+using SWRIS.Enums;
 using SWRIS.Events;
 using SWRIS.Extensions;
 using SWRIS.Models;
@@ -122,7 +121,7 @@ namespace SWRIS.Core
             }
             catch (Exception ex)
             {
-                Console.WriteLine($"Error accepting client: {ex.Message}");
+                LogHelper.Error($"Error accepting client: {ex.Message}", ex);
             }
         }
         private void StartHeartbeatCheck()
@@ -1208,6 +1207,11 @@ namespace SWRIS.Core
             parameterData.WireRopeStrandWireCount = byteTransform.TransInt16(data, index); index += 2;
             #endregion
 
+            #region 限位校准位置
+            parameterData.FirstCalibrationPositiont = byteTransform.TransSingle(data, index); index += 4;
+            parameterData.SecondCalibrationPositiont = byteTransform.TransSingle(data, index); index += 4;
+            #endregion
+
             return (verifyData.SerialNo, parameterData);
         }
         /// <summary>
@@ -1255,6 +1259,10 @@ namespace SWRIS.Core
                     WriteBytes(ms, parameters.WireRopeStrandCount);
                     WriteBytes(ms, parameters.WireRopeStrandWireCount);
 
+                    // Calibration Info
+                    WriteBytes(ms, parameters.FirstCalibrationPositiont);
+                    WriteBytes(ms, parameters.SecondCalibrationPositiont);
+
                     var buffer = CreateData(0x02, ms.ToArray(), serialNo);
                     DebugMessageReceived?.Invoke(this, new DebugMessageReceivedEventArgs($"同步设备参数", serialNo: serialNo));
                     clientSocket.Send(buffer);
@@ -1464,7 +1472,7 @@ namespace SWRIS.Core
         /// 发送设置当前实时位置
         /// </summary>
         /// <returns></returns>
-        public bool SendRealTimeAbsolutePositionData(float absolutePosition, string serialNo, Socket clientSocket)
+        public bool SendRealTimeAbsolutePositionData(int switchIndex, float absolutePosition, string serialNo, Socket clientSocket)
         {
             try
             {
@@ -1472,7 +1480,7 @@ namespace SWRIS.Core
                     return false;
                 using (var ms = new MemoryStream())
                 {
-                    ms.WriteByte(1);// 1=设置当前实时位置
+                    ms.WriteByte((byte)switchIndex);// 0无关联开关 1 关联开关1 2关联开关2
                     WriteBytes(ms, absolutePosition);
                     byte[] buffer = CreateData(0x15, ms.ToArray(), serialNo);
                     DebugMessageReceived?.Invoke(this, new DebugMessageReceivedEventArgs($"发送设置当前实时位置请求", serialNo: serialNo));
@@ -1686,7 +1694,7 @@ namespace SWRIS.Core
 
             return (serialNo, buffer);
         }
-    
+
         public void Dispose()
         {
             try

+ 0 - 14
Enums/FaultState.cs

@@ -1,14 +0,0 @@
-namespace SWRIS.Enums
-{
-    public enum FaultState
-    {
-        /// <summary>
-        /// 正常
-        /// </summary>
-        Normal = 0,
-        /// <summary>
-        /// 异常
-        /// </summary>
-        Abnormal = 1
-    }
-}

+ 4 - 0
Enums/FaultType.cs

@@ -2,6 +2,10 @@
 {
     public enum FaultType
     {
+        /// <summary>
+        /// 无故障
+        /// </summary>
+        None = 0,
         /// <summary>
         /// 传感器故障
         /// </summary>

BIN
Fonts/Alibaba-PuHuiTi-Heavy.ttf


BIN
Fonts/Alibaba-PuHuiTi-Light.ttf


+ 1 - 1
MainWindow.xaml.cs

@@ -133,7 +133,7 @@ namespace SWRIS
                             limit.State = LimitState.AtLimit;
                             // 当前运行状态添加预标定状态
                             equipment.RunningStatus |= RunningStatus.PreCalibration;
-                            if (App.TcpServer.SendRealTimeAbsolutePositionData((float)limitData.Position, equipment.SerialNo, equipment.ClientSocket))
+                            if (App.TcpServer.SendRealTimeAbsolutePositionData(limit.SwitchIndex, (float)limitData.Position, equipment.SerialNo, equipment.ClientSocket))
                             {
                                 DebugMessageShow($"{limitData.Name}标定成功", equipment.IpAddress, equipment.SerialNo);
                             }

+ 4 - 0
Mapping.cs

@@ -71,6 +71,8 @@ namespace SWRIS
             targetParam.EncoderDirection = sourceParam.EncoderDirection;
             targetParam.WireRopeStrandCount = sourceParam.WireRopeStrandCount;
             targetParam.WireRopeStrandWireCount = sourceParam.WireRopeStrandWireCount;
+            targetParam.FirstCalibrationPositiont = sourceParam.FirstCalibrationPositiont;
+            targetParam.SecondCalibrationPositiont = sourceParam.SecondCalibrationPositiont;
         }
 
         // 可选:创建新实例的扩展方法
@@ -147,6 +149,8 @@ namespace SWRIS
             targetParam.EncoderDirection = sourceParam.EncoderDirection;
             targetParam.SystemTime = sourceParam.SystemTime;
             targetParam.TwistFactor = sourceParam.TwistFactor;
+            targetParam.FirstCalibrationPositiont = sourceParam.FirstCalibrationPositiont;
+            targetParam.SecondCalibrationPositiont = sourceParam.SecondCalibrationPositiont;
         }
         public static void ToEquipmentDataModel(this EquipmentModel equipmentModel, EquipmentDataModel equipmentDataModel)
         {

+ 10 - 0
Models/CalibrationDataModel.cs

@@ -173,6 +173,7 @@ namespace SWRIS.Models
         private double position;
         private bool isReverse;
         private bool isEnable;
+        private int switchIndex;
         private List<RopeDataModel> relatedRopes;
         public string Name
         {
@@ -228,6 +229,15 @@ namespace SWRIS.Models
                 OnPropertyChanged(nameof(RelatedRopes));
             }
         }
+        public int SwitchIndex
+        {
+            get => switchIndex;
+            set
+            {
+                switchIndex = value;
+                OnPropertyChanged(nameof(SwitchIndex));
+            }
+        }
         public event PropertyChangedEventHandler PropertyChanged;
         protected internal virtual void OnPropertyChanged(string propertyName)
         {

+ 1 - 0
Models/ConfigModel.cs

@@ -93,6 +93,7 @@ namespace SWRIS.Models
         public LimitState State { get; set; }
         public bool IsEnable { get; set; }
         public List<int> RelatedRopes { get; set; } = new List<int>();
+        public int SwitchIndex { get; set; }
     }
     public class SwitchInstance
     {

+ 7 - 1
Models/DataCenterModel.cs

@@ -32,7 +32,13 @@ namespace SWRIS.Models
                     {
                         if (limit.RelatedRopes.Contains(equipment.RopeNumber))
                         {
-                            equipmentData.Limits.Add(new LimitModel { Name = limit.Name, State = LimitState.Offline, IsEnable = limit.IsEnable });
+                            equipmentData.Limits.Add(new LimitModel
+                            {
+                                Name = limit.Name,
+                                State = LimitState.Offline,
+                                SwitchIndex = limit.SwitchIndex,
+                                IsEnable = limit.IsEnable
+                            });
                         }
                     });
                     Equipments.Add(equipmentData);

+ 7 - 0
Models/FaultDataModel.cs

@@ -15,6 +15,10 @@ namespace SWRIS.Models
         /// </summary>
         public int FaultCode { get; set; }
         /// <summary>
+        /// 是否有故障
+        /// </summary>
+        public bool HasFault => FaultCode != 0;
+        /// <summary>
         /// 在用传感器编号列表
         /// </summary>
         public int[] WorkingSensors => GetWorkingSensors(FaultCode);
@@ -25,6 +29,9 @@ namespace SWRIS.Models
 
         public override string ToString()
         {
+            if (!HasFault)
+                return null;
+
             if (FaultType == FaultType.Encoder)
             {
                 return $"编码器故障";

+ 5 - 0
Models/LimitModel.cs

@@ -7,10 +7,15 @@ namespace SWRIS.Models
     {
         private string name;
         private LimitState state;
+        private int switchIndex = 0;
         private bool isEnable;
 
         public string Name { get => name; set { name = value; OnPropertyChanged("Name"); } }
         public LimitState State { get => state; set { state = value; OnPropertyChanged("State"); } }
+        /// <summary>
+        /// 限位开关索引,0无 1位置1 2位置2 
+        /// </summary>
+        public int SwitchIndex { get => switchIndex; set { switchIndex = value; OnPropertyChanged("SwitchIndex"); } }
         public bool IsEnable { get => isEnable; set { isEnable = value; OnPropertyChanged("IsEnable"); } }
 
         public event PropertyChangedEventHandler PropertyChanged;

+ 8 - 1
Models/ParameterModel.cs

@@ -106,6 +106,13 @@ namespace SWRIS.Models.Data
         /// 默认值为1.0,设置2.0表示判伤捻距为2 x 7 = 14d
         /// </summary>
         public float TwistFactor { get; set; }
-
+        /// <summary>
+        /// 限位1校准位置
+        /// </summary>
+        public float FirstCalibrationPositiont { get; set; }
+        /// <summary>
+        /// 限位2校准位置
+        /// </summary>
+        public float SecondCalibrationPositiont { get; set; }
     }
 }

+ 29 - 4
Models/ViewModel/EquipmentSettingViewModel.cs

@@ -1,5 +1,4 @@
-using OpenTK.Graphics.ES20;
-using SWRIS.Dtos;
+using SWRIS.Dtos;
 using SWRIS.Enums;
 using SWRIS.Extensions;
 using System;
@@ -25,7 +24,7 @@ namespace SWRIS.Models.ViewModel
         private RiskLevel soundRiskLevel = RiskLevel.Moderate;
         private ParameterData parameter;
         private bool isConnected;
-        private RunningStatus runningStatus= RunningStatus.SpatialNormal;
+        private RunningStatus runningStatus = RunningStatus.SpatialNormal;
         /// <summary>
         /// 绳号
         /// </summary>
@@ -240,6 +239,9 @@ namespace SWRIS.Models.ViewModel
         private EncoderDirection encoderDirection;
         private DateTime? systemTime;
         private float twistFactor;
+        private float firstCalibrationPositiont;
+        private float secondCalibrationPositiont;
+
 
         /// <summary>
         /// 主板软件版本号
@@ -543,7 +545,30 @@ namespace SWRIS.Models.ViewModel
                 OnPropertyChanged(nameof(TwistFactor));
             }
         }
-
+        /// <summary>
+        ///  限位1校准位置
+        /// </summary>
+        public float FirstCalibrationPositiont
+        {
+            get => firstCalibrationPositiont;
+            set
+            {
+                firstCalibrationPositiont = value;
+                OnPropertyChanged(nameof(FirstCalibrationPositiont));
+            }
+        }
+        /// <summary>
+        /// 限位2校准位置
+        /// </summary>
+        public float SecondCalibrationPositiont
+        {
+            get => secondCalibrationPositiont;
+            set
+            {
+                secondCalibrationPositiont = value;
+                OnPropertyChanged(nameof(SecondCalibrationPositiont));
+            }
+        }
         public event PropertyChangedEventHandler PropertyChanged;
         protected internal virtual void OnPropertyChanged(string propertyName)
         {

+ 66 - 48
Pages/ParameterDialog.xaml

@@ -4,12 +4,16 @@
              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:local="clr-namespace:SWRIS.Pages.RealTime" 
+             xmlns:local="clr-namespace:SWRIS.Pages.RealTime"
              xmlns:vm="clr-namespace:SWRIS.Models.ViewModel"  MaskBrush="#66000000"
              xmlns:cvt="clr-namespace:SWRIS.Converters" AllowsTransparency="True"
-             mc:Ignorable="d" Foreground="#7886B2" FontFamily="{StaticResource PuHuiTiRegular}"
-             FontSize="18" Background="Transparent" WindowStyle="None" ResizeMode="NoResize" 
-             pu:WindowXCaption.Height="0" WindowStartupLocation="CenterScreen" IsEscEnabled="True"
+             mc:Ignorable="d" Foreground="#7886B2"
+             FontFamily="{StaticResource PuHuiTiRegular}"
+             FontSize="18" Background="Transparent" 
+             WindowStyle="None" ResizeMode="NoResize"
+             pu:WindowXCaption.Height="0"
+             WindowStartupLocation="CenterScreen"
+             IsEscEnabled="True"
              Title="ParameterDialog" Height="900" Width="1300">
     <Window.DataContext>
         <vm:EquipmentSettingViewModel/>
@@ -146,7 +150,7 @@
                         <TextBlock Text="采样步长" VerticalAlignment="Center"/>
                         <TextBox Margin="15,0" Text="{Binding Parameter.SamplingStep}"/>
                     </StackPanel>
-                    <StackPanel Orientation="Horizontal" Margin="0,7"  HorizontalAlignment="Right">
+                    <StackPanel Orientation="Horizontal" Margin="0,7"  HorizontalAlignment="Right" Visibility="Collapsed">
                         <TextBlock Text="判伤捻距系数" VerticalAlignment="Center"/>
                         <TextBox Margin="15,0" Text="{Binding Parameter.TwistFactor}"/>
                     </StackPanel>
@@ -189,40 +193,34 @@
                     </StackPanel>
                     <Grid>
                         <Grid.RowDefinitions>
-                            <RowDefinition Height="80"/>
+                            <RowDefinition Height="55"/>
                             <RowDefinition Height="*"/>
-                            <RowDefinition Height="80"/>
+                            <RowDefinition Height="300"/>
                         </Grid.RowDefinitions>
                         <Grid.ColumnDefinitions>
                             <ColumnDefinition Width="*"/>
                             <ColumnDefinition Width="*"/>
                         </Grid.ColumnDefinitions>
-                        <StackPanel Orientation="Horizontal" Grid.ColumnSpan="2" Margin="0,7" HorizontalAlignment="Right">
-                            <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
-                                <TextBlock Text="检测模式" Margin="10,0" VerticalAlignment="Center"/>
-                                <StackPanel Orientation="Horizontal">
-                                    <ToggleButton Content="空域检测" Margin="12,0,5,0" FontSize="18" Width="110"
-                                                  IsChecked="{Binding RunningStatus,
-                                        Converter={StaticResource RunningStatusConverter},
-                                        ConverterParameter=SpatialNormal}" Tag="SpatialNormal" Click="RunningStatus_Click"/>
-                                    <ToggleButton Content="时域检测" Margin="5,0,10,0" FontSize="18" Width="110"
-                                                  IsChecked="{Binding RunningStatus,
-                                        Converter={StaticResource RunningStatusConverter},
-                                        ConverterParameter=TemporalNormal}" Tag="TemporalNormal" Click="RunningStatus_Click"/>
-                                    <ToggleButton Content="停止检测" Margin="5,0,10,0" FontSize="18" Width="110"
-                                                  IsChecked="{Binding RunningStatus,
-                                        Converter={StaticResource RunningStatusConverter},
-                                        ConverterParameter=Stopped}" Tag="Stopped" Click="RunningStatus_Click"/>
-                                </StackPanel>
+                        <StackPanel Orientation="Horizontal" Grid.Row="0" Grid.ColumnSpan="2" Margin="45,0,0,0" HorizontalAlignment="Left" IsEnabled="{Binding IsConnected}">
+                            <TextBlock Text="检测模式" Margin="5,0" VerticalAlignment="Center"/>
+                            <StackPanel Orientation="Horizontal">
+                                <ToggleButton Content="空域检测" Margin="12,0,5,0" FontSize="18" Width="110" IsChecked="{Binding RunningStatus,
+                                    Converter={StaticResource RunningStatusConverter},
+                                    ConverterParameter=SpatialNormal}" Tag="SpatialNormal" Click="RunningStatus_Click"/>
+                                <ToggleButton Content="时域检测" Margin="5,0,10,0" FontSize="18" Width="110" IsChecked="{Binding RunningStatus,
+                                    Converter={StaticResource RunningStatusConverter},
+                                    ConverterParameter=TemporalNormal}" Tag="TemporalNormal" Click="RunningStatus_Click"/>
+                                <ToggleButton Content="停止检测" Margin="5,0,10,0" FontSize="18" Width="110" IsChecked="{Binding RunningStatus,
+                                    Converter={StaticResource RunningStatusConverter},
+                                    ConverterParameter=Stopped}" Tag="Stopped" Click="RunningStatus_Click"/>
                             </StackPanel>
-                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="10,0" IsEnabled="{Binding IsConnected}"/>
                         </StackPanel>
+
                         <StackPanel Orientation="Vertical" Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center">
                             <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
                                 <TextBlock Text="分频系数" VerticalAlignment="Center"/>
                                 <TextBox Margin="15,0" Width="120" Text="{Binding Parameter.FrequencyDivisionFactor}"/>
                             </StackPanel>
-                         
                             <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
                                 <TextBlock Text="前磁极" VerticalAlignment="Center"/>
                                 <StackPanel Orientation="Horizontal"  Margin="0,0,4,0">
@@ -238,7 +236,7 @@
                                 <TextBlock Text="量值系数" VerticalAlignment="Center"/>
                                 <TextBox Margin="15,0" Width="120" Text="{Binding Parameter.ValueCoefficient}"/>
                             </StackPanel>
-                            <StackPanel Orientation="Horizontal" Margin="0,5" HorizontalAlignment="Right">
+                            <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
                                 <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                                     <TextBlock Text="零点位有效行程" HorizontalAlignment="Right"/>
                                 </StackPanel>
@@ -247,7 +245,7 @@
                                     <TextBlock Text="m" Width="35" VerticalAlignment="Center"/>
                                 </StackPanel>
                             </StackPanel>
-                            <StackPanel Orientation="Horizontal" Margin="0,5" HorizontalAlignment="Right">
+                            <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
                                 <StackPanel Orientation="Vertical" VerticalAlignment="Center">
                                     <TextBlock Text="零点位静止时长" HorizontalAlignment="Right"/>
                                 </StackPanel>
@@ -256,20 +254,23 @@
                                     <TextBlock Text="秒" Width="35" VerticalAlignment="Center"/>
                                 </StackPanel>
                             </StackPanel>
-                            <StackPanel Orientation="Horizontal" Margin="0,5" HorizontalAlignment="Right">
-                                <StackPanel Orientation="Vertical" VerticalAlignment="Center">
-                                    <TextBlock Text="零点位偏移值" HorizontalAlignment="Right"/>
-                                </StackPanel>
-                                <StackPanel Orientation="Horizontal"  Margin="0,0,4,0">
-                                    <TextBox Margin="15,0,6,0" Width="90" Text="{Binding Parameter.ZeroPositionCorrectionOffset}"/>
-                                    <TextBlock Text="mm" Width="35" VerticalAlignment="Center"/>
-                                </StackPanel>
-                            </StackPanel>
                         </StackPanel >
                         <StackPanel Orientation="Vertical" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Center">
                             <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
                                 <TextBlock Text="时域频率" VerticalAlignment="Center"/>
-                                <TextBox Margin="15,0" Width="120" Text="{Binding Parameter.TimeDomainFrequency}"/>
+                                <TextBox Margin="15,0" Width="120" Text="{Binding Parameter.TimeDomainFrequency}"
+                                         IsEnabled="{Binding RunningStatus,Converter={StaticResource RunningStatusConverter},ConverterParameter=TemporalNormal}"/>
+                            </StackPanel>
+                            <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
+                                <TextBlock Text="后磁极" VerticalAlignment="Center"/>
+                                <StackPanel Orientation="Horizontal"  Margin="0,0,4,0">
+                                    <TextBox Margin="15,0,6,0" Width="80" Text="{Binding Parameter.BackMagnetLength}"/>
+                                    <TextBlock  Text="mm" Width="45" VerticalAlignment="Center"/>
+                                </StackPanel>
+                            </StackPanel>
+                            <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
+                                <TextBlock Text="损伤门限" VerticalAlignment="Center"/>
+                                <TextBox Margin="15,0" Width="120" Text="{Binding Parameter.DamageThreshold}"/>
                             </StackPanel>
                             <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
                                 <TextBlock Text="黄色警报" VerticalAlignment="Center"/>
@@ -280,24 +281,23 @@
                                 <TextBox Margin="15,0" Width="120" Text="{Binding Parameter.AlarmValue}"/>
                             </StackPanel>
                             <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
-                                <TextBlock Text="后磁极" VerticalAlignment="Center"/>
+                                <StackPanel Orientation="Vertical" VerticalAlignment="Center">
+                                    <TextBlock Text="零点位偏移值" HorizontalAlignment="Right"/>
+                                </StackPanel>
                                 <StackPanel Orientation="Horizontal"  Margin="0,0,4,0">
-                                    <TextBox Margin="15,0,6,0" Width="80" Text="{Binding Parameter.BackMagnetLength}"/>
-                                    <TextBlock  Text="mm" Width="45" VerticalAlignment="Center"/>
+                                    <TextBox Margin="15,0,6,0" Width="90" Text="{Binding Parameter.ZeroPositionCorrectionOffset}"/>
+                                    <TextBlock Text="mm" Width="35" VerticalAlignment="Center"/>
                                 </StackPanel>
                             </StackPanel>
-                            <StackPanel Orientation="Horizontal" Margin="0,7" HorizontalAlignment="Right">
-                                <TextBlock Text="损伤门限" VerticalAlignment="Center"/>
-                                <TextBox Margin="15,0" Width="120" Text="{Binding Parameter.DamageThreshold}"/>
-                            </StackPanel>
                         </StackPanel>
-                        <StackPanel Orientation="Horizontal" Margin="0,7" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">
+                        <StackPanel Orientation="Horizontal" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Visibility="Collapsed">
                             <StackPanel Orientation="Horizontal">
                                 <TextBlock Text="报警重置" VerticalAlignment="Center"/>
                                 <ToggleButton Content="不重置" Width="90" Margin="10,0,5,0" FontSize="18"
                                               IsChecked="{Binding Parameter.SoundLightAlarmAutoResetMode,Converter={StaticResource ResetTypeConverter},ConverterParameter=0}"/>
                             </StackPanel>
-                            <ToggleButton Content="新测试重置" Width="110" Margin="5,5" FontSize="18" IsChecked="{Binding Parameter.SoundLightAlarmAutoResetMode,Converter={StaticResource ResetTypeConverter},ConverterParameter=-1}"/>
+                            <ToggleButton Content="新测试重置" Width="110" Margin="5,5" FontSize="18" 
+                                          IsChecked="{Binding Parameter.SoundLightAlarmAutoResetMode,Converter={StaticResource ResetTypeConverter},ConverterParameter=-1}"/>
                             <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
                                 <StackPanel Orientation="Horizontal" Margin="5,7" HorizontalAlignment="Right">
                                     <ToggleButton Content="延时重置" Width="90" FontSize="18" 
@@ -307,7 +307,25 @@
                                         <TextBlock Text="秒" Width="30" VerticalAlignment="Center"/>
                                     </StackPanel>
                                 </StackPanel>
-
+                            </StackPanel>
+                        </StackPanel>
+                        <StackPanel Orientation="Vertical" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2">
+                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
+                                <Rectangle Height="2" Width="200" Stroke="#3B3B7B"/>
+                                <TextBlock Text="位置校准" Foreground="#615CDD" FontSize="24" Margin="15" FontWeight="Regular"/>
+                                <Rectangle Height="2" Width="200" Stroke="#3B3B7B"/>
+                            </StackPanel>
+                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" >
+                                <StackPanel Orientation="Horizontal" Margin="10,5,15,5"  HorizontalAlignment="Right">
+                                    <TextBlock Text="校准位置1" Margin="5,0" VerticalAlignment="Center"/>
+                                    <TextBox Margin="5,0,5,0" Width="90" Text="{Binding Parameter.FirstCalibrationPositiont}"/>
+                                    <TextBlock Text="m" Width="20" VerticalAlignment="Center"/>
+                                </StackPanel>
+                                <StackPanel Orientation="Horizontal" Margin="15,5,0,5"  HorizontalAlignment="Right">
+                                    <TextBlock Text="校准位置2" Margin="5,0" VerticalAlignment="Center"/>
+                                    <TextBox Margin="5,0,5,0" Width="100" Text="{Binding Parameter.SecondCalibrationPositiont}"/>
+                                    <TextBlock Text="m" Width="20" VerticalAlignment="Center"/>
+                                </StackPanel>
                             </StackPanel>
                         </StackPanel>
                     </Grid>

+ 22 - 21
Pages/SettingDialog.xaml

@@ -21,6 +21,7 @@
         <cvt:PercentageConverter x:Key="PercentageConverter"/>
         <cvt:NullToVisibilityConverter x:Key="NullToVisibilityConverter"/>
         <cvt:ModuleTypeToVisibilityConverter x:Key="ModuleTypeToVisibilityConverter"/>
+        <cvt:LimitSwitchNumberToBooleanConverter x:Key="LimitSwitchNumberToBooleanConverter"/>
     </pu:WindowX.Resources>
     <Border BorderThickness="2" BorderBrush="#3B3B7B" CornerRadius="10">
         <Grid Margin="20">
@@ -217,22 +218,32 @@
                         <ItemsControl.ItemTemplate>
                             <DataTemplate>
                                 <StackPanel Orientation="Horizontal" >
-                                    <CheckBox IsChecked="{Binding IsEnable}" ToolTip="是否启用" Margin="0,25,5,0" BorderThickness="1.6" pu:CheckBoxHelper.GlyphThickness="2"/>
+                                    <CheckBox IsChecked="{Binding IsEnable}" ToolTip="是否启用" Margin="0,25,5,0" BorderThickness="1.6"
+                                              pu:CheckBoxHelper.GlyphThickness="2"/>
                                     <StackPanel Orientation="Horizontal" IsEnabled="{Binding IsEnable}">
                                         <StackPanel Orientation="Vertical" Margin="0,0,20,0">
-                                            <TextBlock Text="限位" Foreground="#7886B2" FontWeight="Regular"/>
+                                            <StackPanel Orientation="Horizontal">
+                                            <TextBlock Text="限位" Margin="0,0,5,0" Foreground="#7886B2" FontWeight="Regular"/>
+                                                <CheckBox Content="1" Padding="2,0" Margin="5,0"
+                                                          IsChecked="{Binding SwitchIndex, Converter={StaticResource LimitSwitchNumberToBooleanConverter}, 
+                                                                         ConverterParameter=1}"/>
+                                                <CheckBox Content="2" Padding="2,0" 
+                                                          IsChecked="{Binding SwitchIndex, Converter={StaticResource LimitSwitchNumberToBooleanConverter},
+                                                                         ConverterParameter=2}"/>
+                                            </StackPanel>
                                             <TextBox Margin="0,10" Text="{Binding Name}" Width="120"/>
                                         </StackPanel>
                                         <StackPanel Orientation="Vertical" Margin="0,0,40,0">
                                             <TextBlock Text="地址" Foreground="#7886B2" FontWeight="Regular"/>
                                             <Grid Margin="0,10">
                                                 <TextBox Text="{Binding Address}" Width="80" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
-                                                <CheckBox Content="反" ToolTip="取反" IsChecked="{Binding IsReverse}" HorizontalAlignment="Right" VerticalAlignment="Top"
-                                                      Foreground="LightGreen" BorderBrush="LightGreen"
-                                                      Margin="0,0,-30,0" Width="35" Height="22" FontSize="15" Padding="1"
-                                                      pu:CheckBoxHelper.CheckedGlyphBrush="OrangeRed"
-                                                      pu:CheckBoxHelper.CheckedForeground="OrangeRed"
-                                                      pu:CheckBoxHelper.CheckedBorderBrush="OrangeRed">
+                                                <CheckBox Content="反" ToolTip="取反" IsChecked="{Binding IsReverse}" HorizontalAlignment="Right" 
+                                                          VerticalAlignment="Top"
+                                                          Foreground="LightGreen" BorderBrush="LightGreen"
+                                                          Margin="0,0,-30,0" Width="35" Height="22" FontSize="15" Padding="1"
+                                                          pu:CheckBoxHelper.CheckedGlyphBrush="OrangeRed"
+                                                          pu:CheckBoxHelper.CheckedForeground="OrangeRed"
+                                                          pu:CheckBoxHelper.CheckedBorderBrush="OrangeRed">
                                                     <CheckBox.LayoutTransform>
                                                         <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
                                                     </CheckBox.LayoutTransform>
@@ -254,9 +265,7 @@
                                             </ItemsControl.ItemsPanel>
                                             <ItemsControl.ItemTemplate>
                                                 <DataTemplate>
-                                                    <CheckBox Content="{Binding RopeName}"
-                                                          Tag="{Binding RopeNumber}" 
-                                                          IsChecked="{Binding IsSelected}"/>
+                                                    <CheckBox Content="{Binding RopeName}" Tag="{Binding RopeNumber}" IsChecked="{Binding IsSelected}"/>
                                                 </DataTemplate>
                                             </ItemsControl.ItemTemplate>
                                         </ItemsControl>
@@ -269,16 +278,8 @@
             </StackPanel>
             <Grid Grid.Row="4" Grid.ColumnSpan="3">
                 <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
-                    <Button Content="取消" Width="130" Height="60" FontWeight="Regular" pu:ButtonHelper.CornerRadius="15" IsCancel="True" Margin="30,0">
-                        <Button.Background>
-                            <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
-                                <GradientStop Color="#615E7C" Offset="0.0"/>
-                                <GradientStop Color="#807E9F" Offset="1.0"/>
-                            </LinearGradientBrush>
-                        </Button.Background>
-                    </Button>
-                    <Button Content="保存" Grid.Row="4" Width="250" Height="60" IsDefault="True" FontWeight="Bold"
-                        FontFamily="{StaticResource PuHuiTiRegular}" Click="Save_Click"/>
+                    <Button  Content="取消" Width="100" Height="50" Margin="10,0" IsCancel="True" Style="{StaticResource CancelButton}"/>
+                    <Button  Content="保存" Width="150" Height="50" Margin="20,0" IsDefault="True" Click="Save_Click"/>
                 </StackPanel>
                 <CheckBox Content="保存后重新启动程序" Foreground="Orange" BorderBrush="Orange"
                           pu:CheckBoxHelper.CheckedGlyphBrush="Orange" Margin="0,10,0,0" IsChecked="{Binding IsAutoStart}"

+ 23 - 23
Pages/SettingDialog.xaml.cs

@@ -21,7 +21,7 @@ namespace SWRIS.Pages
         public SettingDialog()
         {
             InitializeComponent();
-            SettingView = new SettingViewModel()
+            SettingView = new SettingViewModel
             {
                 AppName = App.Config.AppName,
                 Version = App.Config.Version,
@@ -37,28 +37,26 @@ namespace SWRIS.Pages
                 SoundRiskLevel = (int)App.Config.SoundRiskLevel,
                 CleanScheduledTime = App.Config.CleanScheduledTime,
                 DamageNearPointCount = App.Config.DamageNearPointCount,
-            };
-            SettingView.Calibration = new CalibrationDataModel
-            {
-                ModuleType = (int)App.Config.Calibration.ModuleType,
-                Limits = new ObservableCollection<LimitDataModel>()
-            };
-
-            SettingView.Calibration.Tcp = new TcpDataModel
-            {
-                IpAddress = App.Config.Calibration.Tcp.IpAddress,
-                Port = App.Config.Calibration.Tcp.Port,
-                Station = App.Config.Calibration.Tcp.Station
-            };
-
-            SettingView.Calibration.Serial = new SerialDataModel
-            {
-                PortName = App.Config.Calibration.Serial.PortName,
-                BaudRate = App.Config.Calibration.Serial.BaudRate,
-                DataBits = App.Config.Calibration.Serial.DataBits,
-                Parity = App.Config.Calibration.Serial.Parity.ToString(),
-                StopBits = (int)App.Config.Calibration.Serial.StopBits,
-                Station = App.Config.Calibration.Serial.Station
+                Calibration = new CalibrationDataModel
+                {
+                    ModuleType = (int)App.Config.Calibration.ModuleType,
+                    Limits = new ObservableCollection<LimitDataModel>(),
+                    Tcp = new TcpDataModel
+                    {
+                        IpAddress = App.Config.Calibration.Tcp.IpAddress,
+                        Port = App.Config.Calibration.Tcp.Port,
+                        Station = App.Config.Calibration.Tcp.Station
+                    },
+                    Serial = new SerialDataModel
+                    {
+                        PortName = App.Config.Calibration.Serial.PortName,
+                        BaudRate = App.Config.Calibration.Serial.BaudRate,
+                        DataBits = App.Config.Calibration.Serial.DataBits,
+                        Parity = App.Config.Calibration.Serial.Parity.ToString(),
+                        StopBits = (int)App.Config.Calibration.Serial.StopBits,
+                        Station = App.Config.Calibration.Serial.Station
+                    }
+                }
             };
 
             foreach (var limit in App.Config.Calibration.Limits)
@@ -70,6 +68,7 @@ namespace SWRIS.Pages
                     Name = limit.Name,
                     Position = limit.Position,
                     IsEnable = limit.IsEnable,
+                    SwitchIndex = limit.SwitchIndex,
                     RelatedRopes = App.Config.Equipments.Select(c => new RopeDataModel
                     {
                         RopeName = c.RopeName,
@@ -125,6 +124,7 @@ namespace SWRIS.Pages
                 targetLimit.Position = sourceLimit.Position;
                 targetLimit.IsEnable = sourceLimit.IsEnable;
                 targetLimit.IsReverse = sourceLimit.IsReverse;
+                targetLimit.SwitchIndex = sourceLimit.SwitchIndex;
                 targetLimit.RelatedRopes = sourceLimit.RelatedRopes
                     .Where(c => c.IsSelected)
                     .Select(c => c.RopeNumber)

+ 2 - 1
SWRIS.csproj

@@ -222,6 +222,7 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </ApplicationDefinition>
+    <Compile Include="Converters\LimitSwitchNumberToBooleanConverter.cs" />
     <Compile Include="Converters\RunningStatusToBooleanConverter.cs" />
     <Compile Include="Converters\ModuleTypeToVisibilityConverter.cs" />
     <Compile Include="Converters\BoolToVisibilityConverter.cs" />
@@ -340,7 +341,6 @@
     <Compile Include="Models\VerifyDataModel.cs" />
     <Compile Include="Enums\AlarmType.cs" />
     <Compile Include="Enums\DamageLevel.cs" />
-    <Compile Include="Enums\FaultState.cs" />
     <Compile Include="Extensions\ByteTransform.cs" />
     <Compile Include="Extensions\DatFileHandler.cs" />
     <Compile Include="Extensions\FirewallHelper.cs" />
@@ -504,6 +504,7 @@
     </Resource>
     <Resource Include="Fonts\Alibaba-PuHuiTi-Bold.ttf" />
     <Resource Include="Fonts\Alibaba-PuHuiTi-Regular.ttf" />
+    <Resource Include="Fonts\Alibaba-PuHuiTi-Medium.ttf" />
     <None Include="README.md" />
     <Resource Include="Resources\bucket.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

+ 29 - 14
SoftAuthDialog.xaml

@@ -12,42 +12,57 @@
         WindowStartupLocation="CenterScreen" 
         AllowsTransparency="True"     
         Background="Transparent"
-        Title="SoftAuthDialog"  Width="540" Height="470" >
+        Title="SoftAuthDialog"  Width="540" Height="490" >
     <Border BorderThickness="5"  CornerRadius="15" Background="#FFFFFF" MouseLeftButtonDown="Card_MouseLeftButtonDown">
         <Grid>
             <StackPanel Orientation="Vertical" Margin="25,0" HorizontalAlignment="Center">
                 <Image Name="imgQRCode" Height="200" Width="200" Margin="40" />
                 <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
-                    <Label Content="本机码:" HorizontalAlignment="Right"/>
-                    <TextBlock Name="txtMachineCode" Text="{Binding Path=AuthorizeModel.MachineCode}"  VerticalAlignment="Center" TextAlignment="Right"/>
-                    <Button Content="复制" Margin="10,0"   Cursor="Hand" BorderThickness="0" Foreground="#0496fc" Click="Copy_Click"/>
+                    <Label Content="本机码:" HorizontalAlignment="Right" VerticalAlignment="Center"/>
+                    <TextBlock Name="txtMachineCode"  FontSize="16"
+                               Text="{Binding Path=AuthorizeModel.MachineCode}"
+                               VerticalAlignment="Center" TextAlignment="Right"/>
+                    <Button Content="复制"  Width="50" Background="Transparent" Cursor="Hand" BorderThickness="0"  
+                            Margin="10,0,0,4" Foreground="#0496fc" Click="Copy_Click"/>
                 </StackPanel>
                 <StackPanel Orientation="Vertical">
                     <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,15,0,25">
                         <Label Content="注册码:" VerticalAlignment="Center" HorizontalAlignment="Right"/>
-                        <ContentControl  Content="{Binding Path=AuthorizeModel.FinalData}">
+                        <ContentControl Content="{Binding Path=AuthorizeModel.FinalData}">
                             <ContentControl.ContentTemplate>
                                 <DataTemplate>
                                     <StackPanel Orientation="Horizontal">
-                                        <TextBox Text="{Binding First}" MinWidth="45" VerticalAlignment="Center" MaxLength="4" Padding="2" >
+                                        <TextBox x:Name="TextBoxFirst" FontSize="16" Style="{StaticResource AuthorizeTextBoxStyle}"
+                                                    Text="{Binding First, UpdateSourceTrigger=PropertyChanged}"
+                                                     Padding="6" VerticalAlignment="Bottom" MaxLength="4" CharacterCasing="Upper"
+                                                    TextChanged="OnCodeTextBoxTextChanged">
                                             <TextBox.CommandBindings>
                                                 <CommandBinding Command="ApplicationCommands.Paste" Executed="PasteExecuted" />
                                             </TextBox.CommandBindings>
                                         </TextBox>
                                         <Label Content="-"/>
-                                        <TextBox Text="{Binding Second}" MinWidth="45" VerticalAlignment="Center"  MaxLength="4" Padding="2" >
+                                        <TextBox x:Name="TextBoxSecond" FontSize="16" Style="{StaticResource AuthorizeTextBoxStyle}"
+                                                 Text="{Binding Second, UpdateSourceTrigger=PropertyChanged}"
+                                                 Padding="6" VerticalAlignment="Bottom" MaxLength="4" CharacterCasing="Upper"
+                                                 TextChanged="OnCodeTextBoxTextChanged">
                                             <TextBox.CommandBindings>
                                                 <CommandBinding Command="ApplicationCommands.Paste" Executed="PasteExecuted" />
                                             </TextBox.CommandBindings>
                                         </TextBox>
                                         <Label Content="-"/>
-                                        <TextBox Text="{Binding Third}" MinWidth="45" VerticalAlignment="Center"  MaxLength="4" Padding="2" >
+                                        <TextBox x:Name="TextBoxThird"  FontSize="16" Style="{StaticResource AuthorizeTextBoxStyle}"
+                                                 Text="{Binding Third, UpdateSourceTrigger=PropertyChanged}"
+                                                 Padding="6" VerticalAlignment="Bottom" MaxLength="4" CharacterCasing="Upper"
+                                                 TextChanged="OnCodeTextBoxTextChanged">
                                             <TextBox.CommandBindings>
                                                 <CommandBinding Command="ApplicationCommands.Paste" Executed="PasteExecuted" />
                                             </TextBox.CommandBindings>
                                         </TextBox>
                                         <Label Content="-"/>
-                                        <TextBox Text="{Binding Fourth}" MinWidth="45" VerticalAlignment="Center"  MaxLength="4" Padding="2"  TextChanged="Fourth_TextChanged" />
+                                        <TextBox x:Name="TextBoxFourth" FontSize="16" Style="{StaticResource AuthorizeTextBoxStyle}"
+                                                 Text="{Binding Fourth, UpdateSourceTrigger=PropertyChanged}"
+                                                 Padding="6" VerticalAlignment="Bottom" MaxLength="4" CharacterCasing="Upper"
+                                                 TextChanged="OnCodeTextBoxTextChanged"/>
                                     </StackPanel>
                                 </DataTemplate>
                             </ContentControl.ContentTemplate>
@@ -55,11 +70,11 @@
                         <TextBlock Name="piCheckResult" Margin="10,0,0,0" Width="25" Height="25" VerticalAlignment="Center" Foreground="LawnGreen" Visibility="Hidden"/>
                     </StackPanel>
                 </StackPanel>
-                <StackPanel  Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,20">
-                    <Button Name="btnSave" IsDefault="True" Margin="0 0 20 0" Content="激活" Height="30"
-                              Width="50" Click="BtnSave_Click" Cursor="Hand"/>
-                    <Button IsCancel="True" Margin="20 0 0 0" Content="取消" Width="50" Height="30" 
-                             Cursor="Hand"/>
+                <StackPanel  Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,10">
+                    <Button Name="btnSave" IsDefault="True" Margin="0 0 20 0" Content="激活"   Style="{StaticResource AuthorizeButtonStyle}"
+                             Click="BtnSave_Click" Cursor="Hand" IsEnabled="False"/>
+                    <Button IsCancel="True" Margin="20 0 0 0" Content="取消"   Style="{StaticResource AuthorizeButtonStyle}"
+                             Cursor="Hand" />
                 </StackPanel>
             </StackPanel>
         </Grid>

+ 65 - 0
SoftAuthDialog.xaml.cs

@@ -2,10 +2,14 @@
 using SWRIS.Core;
 using SWRIS.Extensions;
 using SWRIS.Models;
+using System;
 using System.Drawing;
+using System.Linq;
+using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Input;
+using System.Windows.Media;
 
 namespace SWRIS
 {
@@ -76,5 +80,66 @@ namespace SWRIS
             base.OnMouseLeftButtonDown(e);
             DragMove();
         }
+
+        private void OnCodeTextBoxTextChanged(object sender, TextChangedEventArgs e)
+        {
+            TextBox textBox = sender as TextBox;
+            if (textBox == null) return;
+
+            if (AuthorizeModel.FinalCode.Length == 16)
+            {
+                Dispatcher.BeginInvoke(new Action(() =>
+                {
+                    ValidateRegistrationCode();
+                }), System.Windows.Threading.DispatcherPriority.Background);
+            }
+            else
+            {
+                piCheckResult.Visibility = Visibility.Hidden;
+                btnSave.IsEnabled = false;
+            }
+
+            // 当输入框填满4个字符时,自动跳转到下一个
+            if (textBox.Text.Length >= textBox.MaxLength)
+            {
+                if (textBox.Parent is StackPanel parent)
+                {
+                    var textBoxes = parent.Children.OfType<TextBox>().ToList();
+                    var currentIndex = textBoxes.IndexOf(textBox);
+
+                    // 如果不是最后一个文本框,则跳转到下一个
+                    if (currentIndex >= 0 && currentIndex < textBoxes.Count - 1)
+                    {
+                        var nextTextBox = textBoxes[currentIndex + 1];
+                        nextTextBox.Focus();
+                        nextTextBox.SelectAll();
+                    }
+                    else if (currentIndex == textBoxes.Count - 1)
+                    {
+                        // 最后一个输入框填满后,延迟执行验证,避免UI卡顿
+                        Dispatcher.BeginInvoke(new Action(() =>
+                        {
+                            ValidateRegistrationCode();
+                        }), System.Windows.Threading.DispatcherPriority.Background);
+                    }
+                }
+            }
+        }
+        private async void ValidateRegistrationCode()
+        {
+            // 显示加载状态(可选)
+            piCheckResult.Visibility = Visibility.Hidden;
+
+            // 异步执行验证
+            bool isValid = await Task.Run(() => SoftAuth.CheckFinalCode(AuthorizeModel.FinalCode));
+
+            // 回到UI线程更新界面
+            piCheckResult.Visibility = isValid ? Visibility.Visible : Visibility.Hidden;
+            btnSave.IsEnabled = isValid;
+            if (isValid)
+            {
+                piCheckResult.Foreground = new SolidColorBrush(Colors.LawnGreen);
+            }
+        }
     }
 }

+ 29 - 0
Styles/Styles.xaml

@@ -132,6 +132,19 @@
         <Setter Property="pu:TextBoxHelper.CornerRadius" Value="5"/>
         <Setter Property="pu:TextBoxHelper.HoverBorderBrush" Value="#6158E5"/>
     </Style>
+    <Style x:Key="AuthorizeTextBoxStyle" TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
+        <Setter Property="Height" Value="40"/>
+        <Setter Property="Width" Value="70"/>
+        <Setter Property="Background" Value="Transparent"/>
+        <Setter Property="BorderBrush" Value="#3B3B7B"/>
+        <Setter Property="BorderThickness" Value="1,1,1,1"/>
+        <Setter Property="Foreground" Value="#3B3B7B"/>
+        <Setter Property="Padding" Value="6"/>
+        <Setter Property="FontSize" Value="18"/>
+        <Setter Property="HorizontalAlignment" Value="Center"/>
+        <Setter Property="pu:TextBoxHelper.CornerRadius" Value="4"/>
+        <Setter Property="pu:TextBoxHelper.HoverBorderBrush" Value="#6158E5"/>
+    </Style>
     <Style TargetType="pu:NumberInput" BasedOn="{StaticResource {x:Type pu:NumberInput}}">
         <Setter Property="Height" Value="30"/>
         <Setter Property="BorderBrush" Value="#FFC9CCD4"/>
@@ -166,6 +179,22 @@
             </Setter.Value>
         </Setter>
     </Style>
+    <Style x:Key="AuthorizeButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
+        <Setter Property="pu:ButtonHelper.CornerRadius" Value="8"/>
+        <Setter Property="Foreground" Value="#FFFFFF"/>
+        <Setter Property="FontSize" Value="18"/>
+        <Setter Property="Width" Value="85"/>
+        <Setter Property="Cursor" Value="Hand"/>
+        <Setter Property="Height" Value="38"/>
+        <Setter Property="Background">
+            <Setter.Value>
+                <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
+                    <GradientStop Color="#4E38F0" Offset="0.6"/>
+                    <GradientStop Color="#736AFA" Offset="1.2"/>
+                </LinearGradientBrush>
+            </Setter.Value>
+        </Setter>
+    </Style>
     <Style x:Key="CancelButton" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
         <Setter Property="pu:ButtonHelper.CornerRadius" Value="15"/>
         <Setter Property="Foreground" Value="#FFFFFF"/>