为什么获胜';t形成焦点
本文关键字:焦点 获胜 为什么 | 更新日期: 2023-09-27 18:27:47
我有一个以如下方式启动的表单:
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();
}
我看过并尝试过许多例子。光标出现在正确的控件中,但窗体的窗口没有焦点。问题是,如果用户开始键入,即使新启动的表单是可见的,这些键击也不会进入文本框。
删除public FindStreet()中的代码,并在FindStreet的加载事件中添加:
this.TopMost = true; //i don't know why you need this.
this.Activate();
当最小化主窗体时,按z顺序的下一个窗体将获得光标this.Focus()什么都不做。您需要激活对话框。
对话框需要一个所有者,该所有者不能是最小化的窗口。现在,事故开始发生,从WindowState分配开始。您的应用程序没有可以接收焦点的窗口,因此Windows被迫找到另一个窗口,该窗口将由另一个应用程序拥有。关闭对话框时也会出现同样的问题。
您仍然可以获得预期效果,您必须在对话框显示后隐藏主窗口,在对话框关闭前再次显示。这需要一点技巧:
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构造函数中的黑客。注意事件顺序。如果FindStreet中有FormClosing事件处理程序,请确保重写OnFormClosing()。
如果您想将特定控件设置为当前活动控件,请尝试以下操作:
this.ActiveControl = myTextBox;
这将在加载表单时将您想要的光标作为主要焦点。所以试试这个:
public FindStreet()
{
InitializeComponent();
this.TopMost = true;
this.BringToFront();
this.Focus();
this.ActiveControl = myTextBox;
}
这是Focus()的链接,它应该解释为什么您的焦点调用不起作用。