当窗口关闭时,我的应用程序失去焦点。

4

我有两个简单的表格,一个包含一个网格和一个按钮。当我点击按钮时,我的应用程序开始执行长时间操作。在它工作的同时,我显示另一个包含进度条的表格。我这样打开它:

_busyWindow.ShowDialog();

并定义

public partial class BusyWindow :  DevExpress.XtraEditors.XtraForm
{
    public BusyWindow()
    {
        InitializeComponent();
    }

    private void BusyWindow_FormClosing(object sender, FormClosingEventArgs e)
    {
        this.Hide();
        e.Cancel = true; // this cancels the close event.
    }
}

当操作完成后,我会这样隐藏表单:
if (ended)
    _busyWindow.Hide();

它可以正常工作。问题在于,当我关闭第二个表格(使用相同的关闭代码)时,它也能够正常关闭,但是我的主要GUI失去了焦点。例如,如果我在应用程序后面打开Firefox,则Firefox会获得焦点。

只有在打开了busyWindow并关闭第二个表单时才会发生这种情况,而不是没有打开时(即,如果我打开表单,然后在不点击按钮的情况下关闭它,则主GUI不会失去焦点)。

您知道发生了什么或者我应该在哪里搜索吗?

2个回答

3
有两种可能的解决方案可以使您保持对主窗口的焦点:
//编辑:下面示例中的主窗口将是具有网格和按钮的窗口。
1.由于您正在通过ShowDialog()显示忙碌窗口,请尝试通过以下方式设置窗口的所有者: _busyWindow.ShowDialog(this);。我早些时候也遇到了类似的问题,这对我有效。由于指定了busyWindow的所有者,当它关闭时,它会将焦点放回其所有者,即您的主窗口。
2.如果上述技术不起作用(应该会起作用,因为对我有效),您可以尝试将主窗口的引用传递给busyWindow,然后在其关闭时设置主窗口的焦点。样例:
_busyWindow.MyMainWindow = this; //MyMainWindow引用您的应用程序的mainWindow _busyWindow.ShowDialog();
并将以下内容添加到busyWindow的FormClosing中: private void BusyWindow_FormClosing(object sender, FormClosingEventArgs e)
{
    this.Hide();
    e.Cancel = true; // this cancels the close event.
    MainWindow.Focus();
}

看看是否有效。第一个解决方案应该有效。

希望对你有所帮助。

谢谢,祝你使用愉快!


好的...只是提供信息。第一个解决方案还是第二个?我猜是第一个! - Vaibhav
我刚发现它并不总是有效 :(第一个没有起作用,第二个看起来能工作,但有时确实无法正常工作 - pedroruiz
1
如果在隐藏繁忙窗口之前将焦点设置到主窗口,我认为您有时会遇到的问题就会消失。尝试一下并回复结果。在进行WinForms开发时,我经常遇到这些问题。只需在隐藏繁忙窗口之前将焦点放在主窗口上即可。 - Vaibhav
@pedroruiz - 如果这篇帖子解决了您的问题,您可以将其标记为答案。谢谢。 - Vaibhav
@Vaibhav:我曾遇到类似的问题——在FormClosing句柄中执行Me.Hide()解决了它。我不需要e.Cancel或MainWindow.Focus。 - Victor Zakharov

3
只需在关闭子窗口之前将其所有者(Owner)设置为null即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接