如何在 UI 中按下组合键的按钮

How to show button is pressed in UI for combination keys

实际上这个 post 与 this 不同(post 也是我编的)。我的 UI 中有一个 phone 小键盘,现在我可以在按下对应的键时显示按钮已按下。

private void NumDisplayBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
  switch (e.Key) 
  {
    case Key.D0:
    case Key.NumPad0:
      ZeroBtn.Style = (Style) FindResource("PressedButtonStyle");
      break;
    case Key.D1:
    case Key.NumPad1:
      OneBtn.Style = (Style) FindResource("PressedButtonStyle");
      break;
    case Key.D2:
    case Key.NumPad2:
      TwoBtn.Style = (Style) FindResource("PressedButtonStyle");
      break;
    case Key.D3:
    case Key.NumPad3:
      ThreeBtn.Style = (Style) FindResource("PressedButtonStyle");
      break;
    case Key.D4:
    case Key.NumPad4:
      FourBtn.Style = (Style) FindResource("PressedButtonStyle");
      break;
    case Key.D5:
    case Key.NumPad5:
      FiveBtn.Style = (Style) FindResource("PressedButtonStyle");
      break;
    case Key.D6:
    case Key.NumPad6:
      SixBtn.Style = (Style) FindResource("PressedButtonStyle");
      break;
    case Key.D7:
    case Key.NumPad7:
      SevenBtn.Style = (Style) FindResource("PressedButtonStyle");
      break;
    case Key.D8:
    case Key.NumPad8:
      EightBtn.Style = (Style) FindResource("PressedButtonStyle");
      break;
    case Key.D9:
    case Key.NumPad9:
      NineBtn.Style = (Style) FindResource("PressedButtonStyle");
      break;
  }

  if (((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift))
  {
    if (e.Key == Key.D3)
    {
      ThreeBtn.Style = (Style)FindResource("NormalButtonStyle");
      HashBtn.Style = (Style)FindResource("PressedButtonStyle");
    }
  }
}

private void NumDisplayBox_PreviewKeyUp(object sender, KeyEventArgs e) 
{
  switch (e.Key) 
  {
    case Key.D0:
    case Key.NumPad0:
      ZeroBtn.Style = (Style) FindResource("ButtonStyle4"); break;
    case Key.D1:
    case Key.NumPad1:
      OneBtn.Style = (Style) FindResource("ButtonStyle4"); break;

    .
    .
    .
  }
}

问题是当按下哈希键 (Shift + 3) 或星号键 (Shift + 8) 时,UI 中的“3”按钮(用于大小写哈希键)也会被按下。当按下 Shift + 3 时,我如何才能显示在 UI 上仅按下散列按钮,而不是散列按钮与“3”按钮一起按下?

勾选KeyEventArgs.Modifiers 属性,只在没有设置修饰符的情况下处理按键按下。

或者,使用 TextInputPreviewTextInput 事件来获取组合文本而不是实际密钥。无论如何,这可能是更可取的,因为它会响应任何输入适当文本输入的方法,而不是依赖于特定的键(例如,您不必为所有可能的键设置案例,例如 top-行数字键和数字键盘键,就像现在一样)。

这对我有用:

//Make the button to have "pressed" feel when the corresponding key is pressed

private void NumDisplayBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{
    if (((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift))
    {
      if (e.Key == Key.D3)
        HashBtn.Style = (Style) FindResource("PressedButtonStyle");

      if (e.Key == Key.D8)
        StarBtn.Style = (Style) FindResource("PressedButtonStyle");
    }

    switch (e.Key) 
    {
      case Key.D0:
      case Key.NumPad0:
        ZeroBtn.Style = (Style) FindResource("PressedButtonStyle");
        break;
      case Key.D1:
      case Key.NumPad1:
        OneBtn.Style = (Style) FindResource("PressedButtonStyle");
        break;
      case Key.D2:
      case Key.NumPad2:
        TwoBtn.Style = (Style) FindResource("PressedButtonStyle");
        break;
      case Key.D3:
      case Key.NumPad3:
        {
          if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
            ThreeBtn.Style = (Style) FindResource("ButtonStyle4");

          else
            ThreeBtn.Style = (Style) FindResource("PressedButtonStyle");

          break;
        }
      case Key.D4:
      case Key.NumPad4:
        FourBtn.Style = (Style) FindResource("PressedButtonStyle");
        break;
      case Key.D5:
      case Key.NumPad5:
        FiveBtn.Style = (Style) FindResource("PressedButtonStyle");
        break;
      case Key.D6:
      case Key.NumPad6:
        SixBtn.Style = (Style) FindResource("PressedButtonStyle");
        break;
      case Key.D7:
      case Key.NumPad7:
        SevenBtn.Style = (Style) FindResource("PressedButtonStyle");
        break;
      case Key.D8:
      case Key.NumPad8:
        {
          if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
            EightBtn.Style = (Style) FindResource("ButtonStyle4");

          else
            EightBtn.Style = (Style) FindResource("PressedButtonStyle");

          break;
        }
      case Key.D9:
      case Key.NumPad9:
        NineBtn.Style = (Style) FindResource("PressedButtonStyle");
        break;
      default:
        break;
    }
}

//Return back to its original style

private void NumDisplayBox_PreviewKeyUp(object sender, KeyEventArgs e)
{
  switch (e.Key) 
  {
    case Key.D0:
    case Key.NumPad0:
      ZeroBtn.Style = (Style) FindResource("ButtonStyle4");
      break;
    case Key.D1:
    case Key.NumPad1:
      OneBtn.Style = (Style) FindResource("ButtonStyle4");
      break;
    case Key.D2:
    case Key.NumPad2:
      TwoBtn.Style = (Style) FindResource("ButtonStyle4");
      break;
    case Key.D3:
    case Key.NumPad3:
      ThreeBtn.Style = (Style) FindResource("ButtonStyle4");
      HashBtn.Style = (Style) FindResource("ButtonStyle4");
      break;
    case Key.D4:
    case Key.NumPad4:
      FourBtn.Style = (Style) FindResource("ButtonStyle4");
      break;
    case Key.D5:
    case Key.NumPad5:
      FiveBtn.Style = (Style) FindResource("ButtonStyle4");
      break;
    case Key.D6:
    case Key.NumPad6:
      SixBtn.Style = (Style) FindResource("ButtonStyle4");
      break;
    case Key.D7:
    case Key.NumPad7:
      SevenBtn.Style = (Style) FindResource("ButtonStyle4");
      break;
    case Key.D8:
    case Key.NumPad8:
      EightBtn.Style = (Style) FindResource("ButtonStyle4");
      StarBtn.Style = (Style) FindResource("ButtonStyle4");
      break;
    case Key.D9:
    case Key.NumPad9:
      NineBtn.Style = (Style) FindResource("ButtonStyle4");
      break;
    default:
      break;
  }
}