C# 为什么在这个实例中调用Focus()不设置焦点?

C# 为什么在这个实例中调用Focus()不设置焦点?,c#,dynamic,focus,windows-forms-designer,C#,Dynamic,Focus,Windows Forms Designer,我根据您自己的输入框改编了一个roll 我将代码修改为以下内容: using System; using System.Windows.Forms; public static class PromptForText { public static string ShowDialog(string caption, string text) { Form prompt = new Form(); prompt.Width = 280;

我根据您自己的输入框改编了一个roll

我将代码修改为以下内容:

using System;
using System.Windows.Forms;

public static class PromptForText
{
    public static string ShowDialog(string caption, string text)
    {
        Form prompt = new Form();
        prompt.Width = 280;
        prompt.Height = 150;
        prompt.Text = caption;
        Label textLabel = new Label() { Left = 16, Top = 20, Width = 240, Text = text };
        TextBox textBox = new TextBox() { Left = 16, Top = 40, Width = 240 };
        Button confirmation = new Button() { Text = "Okie Doak", Left = 16, Width = 80, Top = 72 };
        confirmation.Click += (sender, e) => { prompt.Close(); };
        prompt.Controls.Add(confirmation);
        prompt.Controls.Add(textLabel);
        prompt.Controls.Add(textBox);
        prompt.StartPosition = FormStartPosition.CenterScreen;
        prompt.ShowDialog();
        textBox.Focus();
        return textBox.Text;
    }
}
我添加了“textBox.Focus()”,但它没有达到我预期的效果。我在调用ShowDialog()之前和之后都尝试了它

我错过了什么?为什么在文本框上调用focus不将focus设置为相同

更新 基于Steve(Wozniak?)创建的控件现在是这样创建的,答案:


call ShowDialog是一个阻塞调用。这意味着在您(或您的用户)关闭表单之前,不会在调用后执行任何代码。在这一点上,对焦点的调用没有任何效果,因为表单仍然在内存中,是隐藏的,可以关闭和释放

作为一个简单的解决方法,只需将TextBox的TabIndex属性设置为表单上的第一个控件。通过这种方式,焦点由表单框架代码自动处理(还需要将TabStop属性设置为true)

经过一点测试后,我应该补充一点,您还需要在Button控件上设置相同的属性才能使其正常工作

 Label textLabel = new Label() { Left = 16, Top = 20, Width = 240, Text = text };
 TextBox textBox = new TextBox()
          { Left = 16, Top = 40, Width = 240, TabIndex = 0, TabStop = true };
 Button confirmation = new Button() 
          { Text = "Okie Doak", Left = 16, Width = 80, Top = 72, TabIndex = 1, TabStop = true };
另一种可能是在添加按钮和标签之前,将文本框作为表单控件集合中的第一个控件添加

 prompt.Controls.Add(textBox);
 prompt.Controls.Add(confirmation);
 prompt.Controls.Add(textLabel);

call ShowDialog是一个阻塞调用。这意味着在您(或您的用户)关闭表单之前,不会在调用后执行任何代码。在这一点上,对焦点的调用没有任何效果,因为表单仍然在内存中,是隐藏的,可以关闭和释放

作为一个简单的解决方法,只需将TextBox的TabIndex属性设置为表单上的第一个控件。通过这种方式,焦点由表单框架代码自动处理(还需要将TabStop属性设置为true)

经过一点测试后,我应该补充一点,您还需要在Button控件上设置相同的属性才能使其正常工作

 Label textLabel = new Label() { Left = 16, Top = 20, Width = 240, Text = text };
 TextBox textBox = new TextBox()
          { Left = 16, Top = 40, Width = 240, TabIndex = 0, TabStop = true };
 Button confirmation = new Button() 
          { Text = "Okie Doak", Left = 16, Width = 80, Top = 72, TabIndex = 1, TabStop = true };
另一种可能是在添加按钮和标签之前,将文本框作为表单控件集合中的第一个控件添加

 prompt.Controls.Add(textBox);
 prompt.Controls.Add(confirmation);
 prompt.Controls.Add(textLabel);

只有在
ShowDialog
完成后,才能执行Focus命令。如果您查看了
ShowDialog
文档-


您将看到ShowDialog仅在窗口关闭时完成。

您的焦点命令仅在
ShowDialog
完成后执行。如果您查看了
ShowDialog
文档-


您将看到ShowDialog仅在窗口关闭时完成。

您的表单仅在调用
ShowDialog()
时可见。为什么在
ShowDialog()
之前设置焦点不起作用我不确定,但在加载和显示表单的过程中,焦点可能会丢失。至于为什么
ShowDialog()
之后不起作用,到那时用户已经显示并关闭了表单。太晚了。要在显示窗体之前立即设置焦点,您可以处理
提示。使用包含焦点代码的方法加载

您的窗体仅在调用
ShowDialog()
时可见。为什么在
ShowDialog()
之前设置焦点不起作用我不确定,但在加载和显示表单的过程中,焦点可能会丢失。至于为什么
ShowDialog()
之后不起作用,到那时用户已经显示并关闭了表单。太晚了。要在显示窗体之前立即设置焦点,可以使用包含焦点代码的方法处理
prompt.Load