【发布时间】:2013-11-18 21:52:56
【问题描述】:
好的。一点设置。
我有一个使用 Unity 的基于 PRISM 的小型应用程序。
我创建了一个类(与 shell 窗口所在的主程序分开),其中包含它自己的 WPF 窗口,以便在更新运行时作为对话框弹出。
该类会进行一些文件复制(真正简单的东西,就像 PoC),并且窗口会向用户更新其进度。
窗口以模态方式显示 (.ShowDialog();) 以便在更新运行时阻塞线程。
更新是在 ContentRendered 事件之外运行的。
更新完成后,在窗口上调用 .Close()。
在主程序的 App.xaml.cs 文件的 OnStartup 事件中,该类被实例化并开始更新过程(通过调用名为 StartUpdate() 的类的公共函数)。
之后,会创建并运行一个引导程序。
最后,在引导程序类中,一些模块被加载(它们除了注册一个视图外不做任何事情),shell 窗口被解析并显示在 InitializeShell 的覆盖中。
所有非常标准的东西,除了程序在退出 InitializeShell 后才关闭。如果我不在更新程序类中调用 .Close 并让用户使用 X 关闭自定义对话框,也会发生同样的事情。我还尝试以非模态方式(仅 .Show())显示对话框,程序的其余部分工作正常。但是,该过程不会阻塞,因此更新将在主程序加载之后或加载时发生。那将毫无意义。我找到了一些解决方法。我只是好奇是否有人可以解释这种行为。
编辑:示例代码 sn-p: 当用户关闭 Window1 窗口时,MainWindow 永远不会加载。
/// <summary>
/// Interaction logic for App.xaml. This is where the program starts.
/// </summary>
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
dialogWPF.Class1 c = new dialogWPF.Class1();
c.Update();
//After this, the program should continue as normal (Open the MainWindow window)
}
}
/// <summary>
/// This is the code for Class1 that is called in App.xaml.cs
/// </summary>
public class Class1
{
private Window1 _win;
public Class1()
{
_win = new Window1();
}
public void Update()
{
_win.ShowDialog();
}
}
【问题讨论】:
-
你能描述一下代码中发生了什么吗?这有点毛茸茸,有点难以理解。
-
将关机模式更改为显式
-
您需要将其缩减为示例代码以重现并发布该代码
-
你的对话框能否只返回一个
DialogResult而不是调用Close(),我怀疑由于对话框首先创建它成为应用程序MainWindow,所以调用close 退出进程。 -
我必须检查将关机模式设置为显式。就返回的 DialogResult 而言,实际上没有从窗口返回任何信息,它只是为了让用户知道发生了什么。虽然我确实希望它以某种方式成为应用程序 MainWindow。
标签: wpf windows c#-4.0 modal-dialog prism-4