之前我曾问过一个非常类似的问题,但我没有得到任何有用的答案。我希望有人可以帮助我。
我有一个现有的托盘应用程序编程为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;
}
如果我取消注释上面的行,我可以拦截close事件,并将Visibility设置为Hidden。用户下次选择“设置”时,我可以将其设置为“可见”。但是,第一次设置打开时,它不会触发Exit事件,shell不会获取所有ReferenceDictionary(或失去对它的访问权限),因此窗口无法正常显示。
有没有办法从应用程序运行WPF,并访问MainWindow(通常似乎是null,并且不属于我自己的窗口类型),因此可以将自定义侦听器添加到mainWindow中?
或者,是否有办法处理静态应用程序,以便下次用户点击“设置”时重新实例化。
我知道必须有一些方法让WPF与Win Forms一起玩得很好。感谢所有试图提供帮助的人。这给我带来了很大的麻烦。
答案 0 :(得分:1)
由于您的设置是一个应用程序,我将使用Winforms应用程序中的System.Diagnostics.Process启动您的WPF设置应用程序。由于您将“设置”作为应用程序启动而不是尝试将其作为窗口调用,因此将加载样式。此外,您可以使用Process的WaitForExit()或WaitForExit(int)方法等待您的设置应用程序完成,仅在设置应用程序完成时才将控制权放回Winforms应用程序。这也可以作为设置应用关闭时请求的通知。
这是一个快速的代码snippit:
在开启设置WPF APP的情况下
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 );