【问题标题】:How to avoid newline when user presses CTRL+ENTER keys in a UWP TextBox with AcceptsReturn = "True"当用户在带有 AcceptsReturn = "True" 的 UWP 文本框中按下 CTRL+ENTER 键时如何避免换行
【发布时间】:2019-12-10 11:16:31
【问题描述】:

我正在开发一个文本编辑 UwP 桌面应用程序,该应用程序需要在用户按下 ENTER 时添加一行,并在用户按下 CTRL + ENTER 时执行另一个过程。问题是删除在第二种情况下也创建的新行。如何防止这种情况发生?

    KeyEventHandler keyeventHandler = new KeyEventHandler(rtbText_KeyDown);

    rtbText.AddHandler(TextBox.KeyDownEvent, keyeventHandler, true);

    private static bool IsCtrlKeyPressed()
    {
        var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control);
        return (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
    }

    private void rtbText_KeyDown(object sender, KeyRoutedEventArgs e)
    {
        if (IsCtrlKeyPressed())
        {
            switch (e.Key)
            {
                case VirtualKey.Enter: 
                    NviNew_Tapped(nviNew, null);
                    e.Handled = true; 
                    break;
            }
        }
    }

【问题讨论】:

    标签: c# uwp keydown


    【解决方案1】:

    您可以使用PreviewKeyDown 事件,因为keydown 事件不会为系统处理的键触发

        private void TextBox_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
        {
            if (Window.Current.CoreWindow.GetKeyState(VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down)&& e.Key == Windows.System.VirtualKey.Enter)
            {
                e.Handled = false;
            }
        }
    

    【讨论】:

      【解决方案2】:

      正如@Vignesh 所说,您可以使用 PreviewKeyDown 事件代替 keydown 事件,并将该事件设置为“已处理”,如 e.Handled = true 以防止添加新行。

      KeyEventHandler keyeventHandler = new KeyEventHandler(rtbText_KeyDown);
      rtbText.AddHandler(TextBox.PreviewKeyDownEvent, keyeventHandler, true);
      

      或者基于这个document,你可以通过覆盖Control.OnKeyDown来改变你的TextBox对按键输入的反应。首先,声明一个继承自 TextBox 的自定义类并覆盖 OnKeyDown 事件。然后你可以继续使用keydown事件来做一些事情。

      public class MyTextBox : TextBox
      {
          protected override void OnKeyDown(KeyRoutedEventArgs e)
          {
              if (Window.Current.CoreWindow.GetKeyState(VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down) && e.Key == VirtualKey.Enter)
              {
                  e.Handled = true;
              }
              else
              {
                  base.OnKeyDown(e);
              }
          }
      }
      

      .xaml:

      <local:MyTextBox Width="400" AcceptsReturn="True" x:Name="rtbText"></local:MyTextBox>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 2017-08-01
        相关资源
        最近更新 更多