How can I make sure only one WPF Window is open at a time?

.net-3.5, c#, winforms, wpf

Solution

Instead of searching the static application objects, you could instead just track this within your window, with a single static variable. Just keep a variable in the window:

private static frmCaseWpf openWindow = null; // Assuming your class name is frmCaseWpf

When you create a window, either in the initialize routines, or OnLoaded, depending on how you want it to work..:

partial class frmCaseWpf {
    public frmCaseWpf {
         this.OnLoaded += frmCaseWpf_OnLoaded;
    }

    private void frmCaseWpf_OnLoaded(object sender, RoutedEventArgs e)
    {
         if (this.openWindow != null)
         {
              // Show message box, active this.openWindow, close this
         }
         this.openWindow = this;
    }
}

If you want this window to be reusable, make sure to set this.openWindow = null; when you close the window, as well.

Problem

I have a WPF window that I am launching from inside of a winform app. I only want to allow once instance of that WPF window to be open at a time, and not warn that user if they try to open it again. I am having a problem however trying to search for that WPF window being open because the window is being launched from a winform. What I normaly do is when searching for a winform, I search for any instances of that winform existing in the `Application.Current.OpenForms`, and when in WPF I search for `Application.Current.Windows` The problem I have is that `System.Windows.Application.Current` is null when launched from inside of a winform, so I can't search for the WPF window that way. Is there any better way of searching for an existing instance of an open window? My Code: ``` if (System.Windows.Application.Current != null) { foreach (System.Windows.Window win in System.Windows.Application.Current.Windows) { if (win is frmCaseWpf) { MessageBox.Show("You may have only one active case open at a time.", "Open Case", MessageBoxButtons.OK, MessageBoxIcon.Stop); win.WindowState = System.Windows.WindowState.Normal; win.Focus(); win.Activate(); return; } } } ```

Original source