为什么不会成为焦点?

时间:2014-10-24 15:22:34

标签: c# visual-studio-2012 setfocus

我有一个像这样以模态方式启动的表单:

private void find_street_Click(object sender, EventArgs e)
{
  this.WindowState = FormWindowState.Minimized;
  Form findForm = new FindStreet();
  findForm.ShowDialog();
  this.WindowState = FormWindowState.Normal;
}

表单正确启动,光标位于第一个文本框中,其TabIndex设置为1.

InitializeComponent();调用外,还存在这些命令。

public FindStreet()
{
  InitializeComponent();
  this.TopMost = true;
  this.BringToFront();
  this.Focus();
}

我看过并试过了一些例子。光标出现在正确的控件中,但窗体的窗口没有焦点。问题是,如果用户开始输入,即使新启动的表单可见,这些击键也不会进入文本框。

3 个答案:

答案 0 :(得分:2)

删除 public FindStreet()中的代码,并在 FindStreet 的加载事件中添加:

this.TopMost = true; //i don't know why you need this.
this.Activate();

当你最小化你的主表单时,z顺序中的下一个获取光标。 this.Focus()没有做任何事情。您需要激活对话框。

答案 1 :(得分:2)

对话框需要所有者,不能是最小化窗口。现在事故开始发生,从WindowState分配开始。您的应用程序没有可以获得焦点的窗口,因此Windows被迫找到另一个,这将是另一个应用程序拥有的窗口。关闭对话框时会发生同样的问题。

您仍然可以获得预期的效果,您必须在对话框显示后隐藏主窗口,在对话框关闭之前再次显示。这需要一点hackorama:

    using (var dlg = FindStreet()) {
        // Show main window when dialog is closing
        dlg.FormClosing += new FormClosingEventHandler((s, cea) => {
            if (!cea.Cancel) this.Show();
        });
        // Hide main window after dialog is shown
        this.BeginInvoke(new Action(() => {
            this.Hide();
        }));
        dlg.StartPosition = FormStartPosition.Manual;
        dlg.Location = this.Location;
        if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
            // etc...
        }
    }

从FindStreet构造函数中删除hack。如果在FindStreet中有FormClosing事件处理程序,请注意事件顺序,请务必覆盖OnFormClosing()。

答案 2 :(得分:0)

如果要将特定控件设置为当前活动控件,请尝试以下操作:

this.ActiveControl = myTextBox;

当表单加载时,这会将您想要的光标作为主焦点。所以试试这个:

public FindStreet()
{
  InitializeComponent();
  this.TopMost = true;
  this.BringToFront();
  this.Focus();
  this.ActiveControl = myTextBox;
}

以下是Focus()的链接,可以解释为什么您的焦点调用无效。