pedroruiz
pedroruiz

Reputation: 185

My application loses focus when a window is closed

I have a simple two forms, one that contains a grid and a button. When I click the button, my application starts doing a long operation. While it is working, I show another form that contains a progress bar I open it like this:

_busyWindow.ShowDialog();

And defined

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.
    }
}

When the operation is finished, I hide the form like this

if (ended)
    _busyWindow.Hide();

It works fine. The problem is that when I close the second form (same closing code), it also closes fine but my main GUI loses the focus. For example, if I have the Firefox opened behind the application, then the Firefox gets the focus.

This only happens when I close the second form when the busyWindow has been opened, and no when it hasn't (ie, if I open the form, I close it without clicking on the button, then the main GUI doesn't lose the focus).

Do you know what is happening or where could I try to search?

Upvotes: 5

Views: 3511

Answers (2)

name1ess0ne
name1ess0ne

Reputation: 928

Just set child's window Owner = null before closing it

Upvotes: 6

Vaibhav
Vaibhav

Reputation: 1166

There could be two possible solutions to enable you to keep focus on your main window:

//Edited: Main Window in the below example would be the window with Grid and Button.

  1. Since you are showing the busy window via ShowDialog() try setting the owner of the window by this: _busyWindow.ShowDialog(this);. I had earlier faced a similar problem and this worked for me. Since you specify the owner of the busyWindow, when it closes it would put the focus back on its owner,i.e. your main window

  2. In case the above technique doesnt work (it should, as it worked for me), you could try to pass the reference of the main window to the busyWindow and then on its close set the focus of the main window. Sample:

_busyWindow.MyMainWindow = this; //MyMainWindow references mainWindow of your app _busyWindow.ShowDialog();

And the following at the FormClosing of busyWindow:

private void BusyWindow_FormClosing(object sender, FormClosingEventArgs e)

{
    this.Hide();
    e.Cancel = true; // this cancels the close event.
    MainWindow.Focus();
}

See if it works. The first solution should work.

Hope it helps.

Thanks & Happy Windowing!

Upvotes: 4

Related Questions