Jose Afonso
Jose Afonso

Reputation: 117

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. 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;
            }
        }
    }

Upvotes: 0

Views: 253

Answers (2)

Faywang - MSFT
Faywang - MSFT

Reputation: 5868

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.

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. First, declare a custom class inherits from TextBox and override OnKeyDown event. Then you can continue to use keydown event to do something.

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>

Upvotes: 1

Vignesh
Vignesh

Reputation: 1882

You can use PreviewKeyDown Event as keydown event will not fire for system handled keys

    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;
        }
    }

Upvotes: 1

Related Questions