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;});