WPF事件绑定

wpf需要在当前页面做绑定,全局keydown处理扫码

根元素设置逻辑焦点元素

FocusManager.FocusedElement="{Binding ElementName=grid}"

需要焦点的元素


具体如下



    
        
            
            
        

        
            
                
                
                
                    
                    
                
            
        

        
            
            
            
        
    


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

/// 
        /// 解析KEY.
        /// 
        /// 
        /// 
        /// 
        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值



    
        
            
            
        

        
        
            
                
                
                
                    
                    
                
            
        

        
            
            
            
        
    


3.全局hook

jianshu.com/p/f88467aa2544

你可能感兴趣的:(WPF,wpf)