我有一个从 winform 应用程序内部启动的 WPF 窗口。我只想允许一次打开该 WPF 窗口的一个实例,并且如果该用户尝试再次打开它,则不会警告该用户。

我遇到了一个问题,但是试图搜索正在打开的 WPF 窗口,因为该窗口是从 winform 启动的。我通常做的是在搜索 winform 时,我搜索 Application.Current.OpenForms 中存在的该 winform 的任何实例,而在 WPF 中我搜索 Application.Current.Windows
我遇到的问题是从 winform 内部启动时 System.Windows.Application.Current 为空,因此我无法以这种方式搜索 WPF 窗口。有没有更好的方法来搜索打开窗口的现有实例?

我的代码:

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

最佳答案

您可以不用搜索静态应用程序对象,而是使用单个静态变量在窗口中跟踪它。只需在窗口中保留一个变量:

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

当你创建一个窗口时,无论是在初始化例程中,还是在 OnLoaded 中,取决于你希望它如何工作..:
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;
    }
}

如果您希望此窗口可重用,请确保设置 this.openWindow = null;当您关闭窗口时,也是​​如此。

关于c# - 如何确保一次只打开一个 WPF 窗口?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1335785/

10-17 02:35