0

可能重复:
WPF UI 关闭时的通知

我以前问过一个非常相似的问题,但我没有得到任何有用的回答。我希望那里有人可以帮助我。

我有一个现有的托盘应用程序被编程为 Windows 窗体应用程序。我有一个编程为 WPF 的现有设置表单。

托盘应用程序需要能够: * 打开设置应用程序 n 次,一次只打开一个实例 * 当用户关闭设置应用程序时接收通知。

Settings App 使用 ResourceDictionary,我认为这意味着它必须从 App.xaml 启动。

我可以使用以下代码打开设置窗口一次并在托盘关闭时通知托盘,但我无法再次打开它。

        if (gui == null)
        {
            //shell = new mainWindow();
            //shell.CloseEvent += settings_FormClosed;

            gui = new App();
            //gui.ShutdownMode = ShutdownMode.OnExplicitShutdown;
            gui.MainWindow = shell;
            gui.InitializeComponent();
            //gui.Run();
            gui.Exit += new System.Windows.ExitEventHandler(settings_FormClosed);

            IsUIOpen = true;
        }

如果我取消注释上面的行,我可以拦截关闭事件,并将可见性设置为隐藏。下次用户选择设置时,我可以将其设置回可见。但是,第一次打开 Settings 时,它不会触发 Exit 事件,并且 shell 没有获取所有 ReferenceDictionary(或无法访问它),因此窗口无法正确显示。

有没有办法从应用程序运行 WPF,并访问 MainWindow(它通常似乎为 null,并且不是我自己的窗口的类型),以便可以将自定义侦听器添加到 mainWindow?

或者,有没有办法处理静态应用程序,以便我可以在下次用户单击设置时重新实例化它。

我知道必须有某种方法可以让 WPF 与 Win Forms 配合得很好。感谢所有试图提供帮助的人。这一直让我很头疼。

4

1 回答 1

1

由于您的设置是一个应用程序,我将使用 Winforms 应用程序中的 System.Diagnostics.Process 来启动您的 WPF 设置应用程序。由于您将设置作为应用程序启动,而不是尝试将其作为窗口调用,因此您的样式将被加载。此外,您可以使用 Process 的 WaitForExit() 或 WaitForExit(int) 方法等待设置应用程序完成,仅在设置应用程序完成时将控制权交还给 Winforms 应用程序。这也可用作“设置”应用关闭时请求的通知。

这是一个快速的代码片段:

如果打开设置 WPF 应用程序:

Process myProcess = new Process();
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.FileName = "C:\\mysettingsapp\\mysettingsapp.exe"; // replace with path to your settings app
myProcess.StartInfo.CreateNoWindow = false;
myProcess.Start();
// the process is started, now wait for it to finish
myProcess.WaitForExit();  // use WaitForExit(int) to establish a timeout

通过在主线程上调用 WaitForExit,WinForms 应用程序被阻塞,等待设置应用程序完成。这将防止用户打开多个设置窗口。我没有看到 Winforms 应用程序的非阻塞要求。所以如果你不能阻止,我可以想出另一种方法。

更新 获取执行程序集的路径:

  string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
于 2012-10-04T19:43:59.043 回答