首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在UWP中对多行文本框使用SHIFT + ENTER

在UWP中对多行文本框使用SHIFT + ENTER
EN

Stack Overflow用户
提问于 2018-12-11 18:42:04
回答 2查看 422关注 0票数 1

我想调整TextBox的行为,以便SHIFT + ENTER在键盘上插入一个新行,而ENTER只执行一个不同的命令(例如改变焦点或按下“发送”,就像在消息应用程序中那样)。

默认情况下,设置为AcceptsReturnTextBoxtrue属性在按ENTER时插入新行。将AcceptsReturn更改为false似乎完全阻止了新行的工作,即使我手动添加了新行:

代码语言:javascript
运行
复制
private void ContentTextBox_KeyUp(object sender, KeyRoutedEventArgs e)
{
    // NOTE - AcceptsReturn is set to false in XAML.
    if (e.Key == VirtualKey.Enter)
    {
        var keyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
        if ((keyState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down)
        {
            // SHIFT is pressed, so add a new line.
            this.ContentTextBox.Text += "\r";
        }
        else
        {
            // SHIFT is not pressed, so execute my ENTER logic.
            this.Focus(FocusState.Programmatic);
        }
    }
}

基于this post,我想出了一个功能可行的解决方案,但有一个视觉副作用。我将AcceptsReturn设置为true,然后在按SHIFT而不是时手动删除新行,然后在按下ENTER时执行我想要的代码。其副作用是textbox扩展以容纳新行,然后立即再次收缩,这意味着它在我的处理程序运行之前自动处理ENTER输入。这方面的守则如下:

代码语言:javascript
运行
复制
private void ContentTextBox_KeyUp(object sender, KeyRoutedEventArgs e)
{
    // NOTE - AcceptsReturn is set to true in XAML.
    if (e.Key == VirtualKey.Enter)
    {
        // If SHIFT is pressed, this next IF is skipped over, so the
        //     default behavior of "AcceptsReturn" is used.
        var keyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
        if ((keyState & CoreVirtualKeyStates.Down) != CoreVirtualKeyStates.Down)
        {
            // SHIFT is not pressed, so remove the new line.
            string textboxText = this.ContentTextBox.Text;
            textboxText = textboxText.Remove(textboxText.Length - 1);
            this.ContentTextBox.Text = textboxText;

            // Execute my ENTER logic.
            this.Focus(FocusState.Programmatic);
        }
    }
}

有什么不同的方法来做这件事,还是有办法消除这种副作用?我试着调整e.IsHandled值,但这不起作用(如果默认行为在我的代码之前运行,这是有意义的)。

EN

Stack Overflow用户

发布于 2018-12-11 19:05:36

处理PreviewKeyDown事件,并将事件标记为“已处理”,将防止添加新行(因此也防止了副作用)。完整的工作守则如下:

代码语言:javascript
运行
复制
private void ContentTextBox_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
    // NOTE - AcceptsReturn is set to true in XAML.
    if (e.Key == VirtualKey.Enter)
    {
        // If SHIFT is pressed, this next IF is skipped over, so the
        //     default behavior of "AcceptsReturn" is used.
        var keyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
        if ((keyState & CoreVirtualKeyStates.Down) != CoreVirtualKeyStates.Down)
        {
            // Mark the event as handled, so the default behavior of 
            //    "AcceptsReturn" is not used.
            e.Handled = true;
        }
    }
}

private void ContentTextBox_KeyUp(object sender, KeyRoutedEventArgs e)
{
    // NOTE - AcceptsReturn is set to true in XAML.
    if (e.Key == VirtualKey.Enter)
    {
        // If SHIFT is pressed, this next IF is skipped over, so the
        //     default behavior of "AcceptsReturn" is used.
        var keyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
        if ((keyState & CoreVirtualKeyStates.Down) != CoreVirtualKeyStates.Down)
        {
            // SHIFT is not pressed, so execute my ENTER logic.
            this.Focus(FocusState.Programmatic);
        }
    }
}
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53730458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档