刷卡登入数据获取

发布于:2025-07-04 ⋅ 阅读:(13) ⋅ 点赞:(0)

1.WPF刷卡登入数据获取,防止用户手动输入

//WPF输入框信息及触发命令
 <StackPanel Orientation="Vertical" VerticalAlignment="Center"  Margin="0 30"  Visibility="{Binding LoginMode,Converter={StaticResource loginModeWithParmVisibilityConverter}, ConverterParameter=IC卡}" >
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="30">
        <TextBox hc:InfoElement.TranslateText="{Binding Path=Text,Mode=OneTime,RelativeSource={RelativeSource Mode=Self}}" Text="刷卡卡号" Margin=" 30 0 0 0" Width="101" Padding="10" VerticalAlignment="Center" IsReadOnly="True"></TextBox>
        <TextBox Text="{Binding CardNum,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" Focusable="True" Name="t_username1" Width="170"  Padding="10" TabIndex="1">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="KeyDown">
                    <i:InvokeCommandAction Command="{Binding DataContext.KeyDownCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBox}}}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBox}}}" />
                </i:EventTrigger>
                <i:EventTrigger EventName="KeyUp">
                    <i:InvokeCommandAction Command="{Binding DataContext.KeyUpCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBox}}}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TextBox}}}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </TextBox>
    </StackPanel>

viewmodel代码

//核心命令
 private DateTime _lastKeyUpTime; // 上次按键弹起时间
 private const int KeyDownThreshold = 200; // 按键时间间隔阈值(单位:毫秒)

 private bool IsKeyDown = false;
 private DateTime KeyUpDateTime = new DateTime();
 public RelayCommand<object> KeyDownCommand => new RelayCommand<object>((obj) =>
 {
     System.Windows.Controls.TextBox textBox = obj as System.Windows.Controls.TextBox;
     if (IsKeyDown && ((LoginMode)GlobalData.LoginMode) == LoginMode.IC卡 && textBox.Text.Length > 1)//加一个是否是密码输入的判断
     {
         textBox.Clear();
         return;
     }
     if (Keyboard.IsKeyDown(Key.Enter)) // 判断是否是 Enter 键
     {
         LoginCmd.Execute(null);
         return;
     }

     IsKeyDown = true;
     //KeyUpDateTime = DateTime.Now;
     
 });

 public RelayCommand<object> KeyUpCommand => new RelayCommand<object>((obj) =>
 {
     System.Windows.Controls.TextBox textBox = obj as System.Windows.Controls.TextBox;
     //var temp = DateTime.Now;
     判断是否密码输入,密码输入直接return。
     //if (((LoginMode)GlobalData.LoginMode) == LoginMode.IC卡 && (temp - KeyUpDateTime).TotalMilliseconds > 100  && textBox.Text.Length > 1)
     //{
     //    textBox.Clear();
     //}

     var currentTime = DateTime.Now;

     // 计算按键时间间隔
     var interval = (currentTime - _lastKeyUpTime).TotalMilliseconds;

     // 如果按键间隔大于阈值,清除输入内容
     if (textBox.Text.Length > 1 && interval > KeyDownThreshold)
     {
         textBox.Clear();
         return;
     }

     _lastKeyUpTime = currentTime; // 更新按键时间


     IsKeyDown = false;
 });