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