WPF事件绑定

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。