在应用程序启动时创建或打开文档

时间:2012-08-24 14:24:33

标签: .net wpf

我正在寻找关于如何在启动使用MVVM和DI的WPF应用程序期间实现创建新/空文档或打开现有文档的逻辑的一些指导。

为了澄清,我所说的行为是您在启动Office或Excel等Office应用程序时看到的常见行为。如果直接启动应用程序(“开始”菜单,任务栏,桌面快捷方式等),将为您创建一个新的空白文档或电子表格;但是,如果双击现有的.docx或.xlsx文件,应用程序将启动并打开现有文档/电子表格,而不是完全绕过创建新文档。

对于我们的应用程序,我们需要在没有任何文档打开之前显示应用程序窗口我们执行逻辑以创建新的空文档或打开现有文档(传递为命令行参数)。

目前我们正在使用在int Main(string[])中配置的IoC容器,我们将主应用程序ViewModel(没有活动文档)注入主窗口的构造函数,然后调用app.Run(mainWindow);

我最初尝试完成此操作是将处理程序连接到mainWindow.Loaded事件并将新的/打开文档逻辑放在那里(执行由NewOpen命令公开的命令ViewModel,与我们的应用程序菜单中的New和Open按钮连接的相同。但是,Loaded事件在窗口显示之前触发,这是一个问题,因为可能会打开旧格式的现有文档,我们需要向用户显示提示,询​​问他们是否会像我们一样升级他们的文件(类似于Visual Studio如何使用向导升级旧格式的解决方案,以及创建备份的选项)。这些提示必须显示为模式窗口,它是主应用程序窗口的子窗口。

有关实施此类行为的最佳做法的建议吗?

修改

在这个特定的实现中,基本问题是如何确定地知道主窗口何时完全呈现并显示在屏幕上,然后执行一些代码。通过阅读SO和其他地方的其他问题,听起来没有官方/内置方式来做到这一点?我已经读过使用Dispatcher来调用具有低优先级的委托,以便在渲染完成之后它才会发生,但这看起来像是一个黑客,更不用说与线程上下文切换相关的性能问题。 / p>

话虽如此,我对其他有关如何实现所需行为的建议持开放态度(在窗口显示后创建新的/打开现有文档)。

1 个答案:

答案 0 :(得分:0)

为未来的人们录制这个..

您是否确定在显示Window之前已加载?

我刚创建了一个简单的测试应用程序,在Window.Loaded中显示一个MessageBox,它按以下顺序发生:

可见变更 活性 装载

当调用Loaded时,窗口对用户可见

从OP更新:

原来它是窗口。我们使用的是Actipro的RibbonWindow,而不是WPF的System.Windows.Window,启动行为也不同。只需将测试应用程序从WPF的Window切换到Actipro,就可以像我们的应用程序一样运行。唉