Search code examples
c#wpfshowminimize

Cannot show MainWindow after minimization


I try to avoid the XY Problem by saying immediately what I want and then what I get. 😛

So, first of all, I minimize my MainWindow and thoroguh its NotifyIcon ContextMenu I want that my MainWindow reappears.

The problem: the MainWindow doesn't appear/show as Window, but it appears as Icon in the toolbar (see figure 2).

The code:

This is the TrayIcon initializer:

    private void InitializeTrayIcon()
    {
        KyactusTrayIcon = new NotifyIcon();
        KyactusTrayIcon.Icon = AppIcon;
        KyactusTrayIcon.Visible = true;
        KyactusTrayIcon.ContextMenu = new ContextMenu(new []
        {
            new MenuItem("Chiudi", ExitApplication),
            new MenuItem("Mostra", ShowMainWindow), 
        });

        ShowNotification(@"Ciao " + Globals.CurrentUser.Name + @"!", @"Benvenuto su Kyactus");

    }

This is the delegate responsible to show the minimized MainWindow (not working at all):

    private void ShowMainWindow(object sender, EventArgs e)
    {
        WindowState = WindowState.Normal;
        Topmost = true;
        Show();
        Activate();
    }

This is what happens when the MainWindow is minimized by clicking the [-] button (ie the Hide() method):

    private void MainWindow_OnStateChanged(object sender, EventArgs e)
    {

        switch (this.WindowState)
        {
            case WindowState.Maximized:
                ShowNotification("Bleah!", "Questo è proprio brutto! :(");
                break;
            case WindowState.Minimized:
                Hide();
                ShowNotification("Avviso", "L'applicazione è ora minimizzata qui");
                break;
            case WindowState.Normal:

                break;
        }
    }

Step one. The method MainWindow_OnStateChanged will be invoked when click on [-]:

enter image description here

Step two. The window disappears (ok) and the Tray icon appears (ok). Then I click on 'Mostra' (translated as 'Show') and the ShowMainWindow delegate will be invoked

enter image description here

Step three. This is the final step, that is, what I do not expect. The MainWindos 'lives' as an Icon in the toolbar. But I can't see it as a Window.

enter image description here

Please note that I have not this problem when I close the window by clicking [X] instead of [-]. So, my suspect is the MainWindow's Window.State. I tried to restore it implementing the WindowState.Normal into the ShowMainWindow, but nothing.


Update: if is use WindowState.Maximized in the ShowMainWindow method, I can see the window again, but it is maximized and this is bad and ugly.


Solution

  • Just change the order of operation when showing the window

    private void ShowMainWindow(object sender, EventArgs e)
    {
        Show();
        WindowState = WindowState.Normal;
        Topmost = true;
        Activate();
    }