wpf需要在当前页面做绑定,全局keydown处理扫码
根元素设置逻辑焦点元素
FocusManager.FocusedElement="{Binding ElementName=grid}"
需要焦点的元素
<Grid
x:Name="grid"
Background="White"
Focusable="True"
Keyboard.KeyDown="ScanPay_KeyDown"/>
具体如下
<local:BasePage
x:Class="AutoPOS.HScanPayPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:local="clr-namespace:AutoPOS"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="950"
d:DesignWidth="1920"
x:TypeArguments="local:ScanPayViewModel"
FocusManager.FocusedElement="{Binding ElementName=grid}"
mc:Ignorable="d">
<Grid
x:Name="grid"
Background="White"
Focusable="True"
Keyboard.KeyDown="ScanPay_KeyDown">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*" />
<ColumnDefinition Width="4*" />
</Grid.ColumnDefinitions>
<Border
Grid.Column="0"
Height="800"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
BorderBrush="LightGray"
BorderThickness="0,0,1,0">
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Vertical">
<TextBlock
HorizontalAlignment="Center"
FontSize="30"
Foreground="Gray"
Text="应付(共3件)" />
<TextBlock
Margin="0,40,0,0"
HorizontalAlignment="Center"
FontSize="70"
Foreground="Red"
Text="¥89.20" />
<StackPanel
Margin="0,40,0,0"
HorizontalAlignment="Center"
Orientation="Horizontal">
<TextBlock
HorizontalAlignment="Center"
FontSize="25"
Foreground="Gray"
Text="原价:¥119.70"
TextDecorations="Strikethrough" />
<TextBlock
Margin="120,0,0,0"
HorizontalAlignment="Center"
FontSize="25"
Foreground="{StaticResource PrimaryColorBrush}"
Text="已优惠:¥20.50" />
</StackPanel>
</StackPanel>
</Border>
<StackPanel
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Vertical">
<TextBlock
HorizontalAlignment="Center"
FontSize="35"
FontWeight="SemiBold"
Foreground="{StaticResource MaterialDesignLightForeground}"
Text="您已选择扫码支付" />
<TextBlock
Margin="20"
HorizontalAlignment="Center"
FontSize="30"
Foreground="Gray"
Text="请打开支付宝、微信或云闪付付款码对准扫码口进行扫描" />
<Image
Height="600"
Margin="0,30,0,30"
Source="/Asset/Images/scanpaylogo.png" />
</StackPanel>
</Grid>
</local:BasePage>
keydown 事件处理
private StringBuilder _cache=new StringBuilder();
private void ScanPay_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
string barcode = _cache.ToString();
_cache.Clear();
ViewModel.ScanPayCommand.Execute(barcode);
}
else
{
bool isPressedShiftKey = e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Shift);
string value = KeyBoardHelper.ParseKeyCode(isPressedShiftKey, e.Key);
_cache.Append(value);
}
}
key序列需要自己转换key到string
/// <summary>
/// 解析KEY.
/// </summary>
/// <param name="bShift"></param>
/// <param name="keyCode"></param>
/// <returns></returns>
public static string ParseKeyCode(bool bShift, Key keyCode)
{
string keyName = "";
if (keyCode >= Key.A && keyCode <= Key.Z)
{
keyName = keyCode.ToString();
}
else if (keyCode >= Key.D0 && keyCode <= Key.D9)
{
if (bShift)
{
switch (keyCode)
{
case Key.D0:
keyName = ")";
break;
case Key.D1:
keyName = "!";
break;
case Key.D2:
keyName = "@";
break;
case Key.D3:
keyName = "#";
break;
case Key.D4:
keyName = "$";
break;
case Key.D5:
keyName = "%";
break;
case Key.D6:
keyName = "^";
break;
case Key.D7:
keyName = "&";
break;
case Key.D8:
keyName = "*";
break;
case Key.D9:
keyName = "(";
break;
}
}
else
{
keyName = keyCode.ToString();
keyName = keyName.Substring(1, 1);
}
}
else if (keyCode >= Key.NumPad0 && keyCode <= Key.NumPad9)
{
keyName = keyCode.ToString(); //NumPad0
keyName = keyName.Substring(6, 1);
}
else
{
switch (keyCode)
{
case Key.Space:
keyName = " ";
break;
case Key.Add:
keyName = "+";
break;
case Key.Subtract:
keyName = "-";
break;
case Key.Divide:
keyName = "/";
break;
case Key.Multiply:
keyName = "*";
break;
case Key.Decimal:
keyName = ".";
break;
case Key.OemMinus:
if (bShift)
keyName = "_";
else
keyName = "-";
break;
case Key.OemPlus:
if (bShift)
keyName = "+";
else
keyName = "=";
break;
case Key.Oem6:
if (bShift)
keyName = "}";
else
keyName = "]";
break;
case Key.OemOpenBrackets:
if (bShift)
keyName = "{";
else
keyName = "[";
break;
case Key.Oem1:
if (bShift)
keyName = ":";
else
keyName = ";";
break;
case Key.Oem7:
if (bShift)
keyName = "\"";
else
keyName = "'";
break;
case Key.Oem5:
if (bShift)
keyName = "|";
else
keyName = "\\";
break;
case Key.OemComma:
if (bShift)
keyName = "<";
else
keyName = ",";
break;
case Key.OemPeriod:
if (bShift)
keyName = ">";
else
keyName = ".";
break;
case Key.OemQuestion:
if (bShift)
keyName = "?";
else
keyName = "/";
break;
case Key.Home:
case Key.End:
case Key.Insert:
case Key.Delete:
case Key.Tab:
case Key.Up:
case Key.Down:
case Key.Left:
case Key.Right:
keyName = keyCode.ToString();
break;
default:
//keyName = keyCode.ToString();
break;
}
}
if (bShift)
{
return keyName.ToUpper();
}
else
{
return keyName.ToLower();
}
}
还有一种方法是用一个隐藏的textbox聚焦,textinput会自动转换KEY值
<local:BasePage
x:Class="AutoPOS.HScanPayPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:local="clr-namespace:AutoPOS"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="950"
d:DesignWidth="1920"
x:TypeArguments="local:ScanPayViewModel"
FocusManager.FocusedElement="{Binding ElementName=txtElement}"
mc:Ignorable="d">
<Grid x:Name="grid" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*" />
<ColumnDefinition Width="4*" />
</Grid.ColumnDefinitions>
<TextBox
x:Name="txtElement"
Focusable="True"
TextInput="TextBox_TextInput"
Visibility="Hidden" />
<Border
Grid.Column="0"
Height="800"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
BorderBrush="LightGray"
BorderThickness="0,0,1,0">
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Vertical">
<TextBlock
HorizontalAlignment="Center"
FontSize="30"
Foreground="Gray"
Text="应付(共3件)" />
<TextBlock
Margin="0,40,0,0"
HorizontalAlignment="Center"
FontSize="70"
Foreground="Red"
Text="¥89.20" />
<StackPanel
Margin="0,40,0,0"
HorizontalAlignment="Center"
Orientation="Horizontal">
<TextBlock
HorizontalAlignment="Center"
FontSize="25"
Foreground="Gray"
Text="原价:¥119.70"
TextDecorations="Strikethrough" />
<TextBlock
Margin="120,0,0,0"
HorizontalAlignment="Center"
FontSize="25"
Foreground="{StaticResource PrimaryColorBrush}"
Text="已优惠:¥20.50" />
</StackPanel>
</StackPanel>
</Border>
<StackPanel
Grid.Column="1"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Vertical">
<TextBlock
HorizontalAlignment="Center"
FontSize="35"
FontWeight="SemiBold"
Foreground="{StaticResource MaterialDesignLightForeground}"
Text="您已选择扫码支付" />
<TextBlock
Margin="20"
HorizontalAlignment="Center"
FontSize="30"
Foreground="Gray"
Text="请打开支付宝、微信或云闪付付款码对准扫码口进行扫描" />
<Image
Height="600"
Margin="0,30,0,30"
Source="/Asset/Images/scanpaylogo.png" />
</StackPanel>
</Grid>
</local:BasePage>
3.全局hook
jianshu.com/p/f88467aa2544
版权声明:本文为pw8992134原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。