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

前端 未结 6 902
一整个雨季
一整个雨季 2021-01-14 08:06

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 t

相关标签:
6条回答
  • 2021-01-14 08:12

    It would be better make the frmCaseWpf class a singleton. That way you can't create another instance

    0 讨论(0)
  • 2021-01-14 08:12

    Rather than try to search for a Window instance, many people use a session- (or system-) wide "Mutex" or a Mutual Exclusion lock. I was going to rewrite one for you, but I found a good codeproject article demonstrating the technique. It's not complex and very simple.

    http://www.codeproject.com/KB/cs/SingleInstanceAppMutex.aspx?msg=2908697

    Sneak peek:

    [STAThread]
    static void Main()
    {
        bool onlyInstance = false;
        Mutex mutex = new Mutex(true, "UniqueApplicationName", out onlyInstance);
        if (!onlyInstance) {
            return;
        }
        Application.Run(new MainForm);
        GC.KeepAlive(mutex);
    }
    

    Hope this helps.

    (edit: of course you'll have to modify this slightly for your particular use-case, but it demos the general idea)

    0 讨论(0)
  • 2021-01-14 08:26

    I am not really a 'proper' programmer, however I have achieved this in a WPF application (not from a winforms one) by using the following:

    Dim wdwDetails As New detailsNew()
    Private Sub openNewDetails(ByVal recordID As String)
        wdwDetails.Owner = Me
        wdwDetails.recordID = recordID
        wdwDetails.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner
        wdwDetails.Show()
    End Sub
    

    Essentially because I am creating the window object outside of the sub that opens it, there will only be a single window. Any new call to the window open sub will use the same object. But I guess that is what Thomas is referring to also.

    Like I said, not sure if this will help you or not though.

    0 讨论(0)
  • 2021-01-14 08:32

    You can use XXXwindown.isLoad to check if window is loaded before you create a new window:

    if ( !ChildWindow.IsLoaded)
    {
       childWindow= new ChildWindow();
       childWindow.Show();
    }
    
    0 讨论(0)
  • 2021-01-14 08:33

    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.

    0 讨论(0)
  • 2021-01-14 08:34

    Here's something that's working for me.

        private About aboutWin;
        private void AboutOpenClicked(object sender, RoutedEventArgs e)
        {
           if(aboutWin == null)
           {
               aboutWin = new About();
               aboutWin.Closed += (a, b) => aboutWin = null;
               aboutWin.Show();
           }
           else
           {
    
               aboutWin.Show();  
           }
    
        }
    
    0 讨论(0)
提交回复
热议问题