0

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

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

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

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

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

有关实施此类行为的最佳实践的任何建议?

编辑

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

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

4

1 回答 1

0

只是记录下来给未来的人..

您确定在显示窗口之前已加载加载吗?

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

可见更改激活加载

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

来自 OP 的更新:

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

于 2012-08-24T16:00:10.400 回答