[英]How to avoid newline when user presses CTRL+ENTER keys in a UWP TextBox with AcceptsReturn = "True"
I'm working on a text editing UwP Desktop application that needs to add a line when the user presses ENTER, and perform another procedure when the user presses CTRL + ENTER.我正在开发一个文本编辑 UwP 桌面应用程序,它需要在用户按下 ENTER 时添加一行,并在用户按下 CTRL + ENTER 时执行另一个过程。 The problem is to delete the new line that is also created in the second case.
问题是删除在第二种情况下也创建的新行。 How to prevent this from happening?
如何防止这种情况发生?
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;
}
}
}
You can use PreviewKeyDown
Event as keydown
event will not fire for system handled keys您可以使用
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;
}
}
As @Vignesh said, you can use PreviewKeyDown Event instead of keydown event and set the event as "handled" like e.Handled = true
to prevent adding the new line.正如@Vignesh 所说,您可以使用PreviewKeyDown事件而不是 keydown 事件,并将事件设置为“已处理”,如
e.Handled = true
以防止添加新行。
KeyEventHandler keyeventHandler = new KeyEventHandler(rtbText_KeyDown);
rtbText.AddHandler(TextBox.PreviewKeyDownEvent, keyeventHandler, true);
Or based on this document , you can change how your TextBox reacts to key input by overriding Control.OnKeyDown
.或者基于此文档,您可以通过覆盖
Control.OnKeyDown
来更改 TextBox 对键输入的反应方式。 First, declare a custom class inherits from TextBox and override OnKeyDown event.首先,声明一个继承自 TextBox 的自定义类并覆盖 OnKeyDown 事件。 Then you can continue to use keydown event to do something.
然后你可以继续使用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: .xaml:
<local:MyTextBox Width="400" AcceptsReturn="True" x:Name="rtbText"></local:MyTextBox>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.