考虑具有以下组件的Windows Forms应用程序

partial class Form1
{
    private System.Windows.Forms.TextBox textBox = new System.Windows.Forms.TextBox();
    private void InitializeComponent()
    {
        textBox.Multiline = true;

        Controls.Add(this.textBox);
        KeyPreview = true;
        KeyDown += new System.Windows.Forms.KeyEventHandler(Form1_KeyDown);
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            e.SuppressKeyPress = true;
            if (textBox.Text.Length > 10)
                MessageBox.Show("Test");
        }
    }
}


现在,预期的行为是将文本写入textBox,然后按Enter。如果文字是


时间不够长,什么也不会发生(由于e.SuppressKeyPress = true;导致)。
足够长的时间,应该弹出空的MessageBox,并且Keys.Enter不应到达textBox组件。但是,当MessageBox弹出时,文本将包含回车引起的换行符。


这是预期的行为还是bug,或者我是唯一遇到这种情况的人?

最佳答案

您可以通过以下方式使用BeginInvoke调用消息框来解决问题:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.SuppressKeyPress = true;
        this.BeginInvoke(new Action(() => {
            if (textBox.Text.Length > 10)
                MessageBox.Show("Test");
        }));
    }
}

关于c# - C#MessageBox导致键处理程序忽略SuppressKeyPress,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39533361/

10-13 06:26