我正在尋找一些關於如何在啓動使用MVVM和DI的WPF應用程序期間實現創建新/空文檔或打開現有文檔的邏輯的指導。在應用程序啓動時創建或打開文檔
爲了說明一下,我說的行爲是您在啓動Office應用程序(如Word或Excel)時看到的常見行爲。如果您直接啓動應用程序(開始菜單,任務欄,桌面快捷方式等),則會爲您創建一個新的空白文檔或電子表格;但如果雙擊現有的.docx或.xlsx文件,應用程序將啓動並打開現有文檔/電子表格,繞過完全創建新文檔。
在我們的申請的情況下,我們需要的應用程序窗口,而不打開任何文件之前我們執行邏輯,以創建新的空文檔,或打開現有的文件(如一個命令行傳遞給顯示論據)。
目前我們使用的是一個在int Main(string[])
中配置的IoC容器,我們在主窗口的構造函數中注入了主應用程序ViewModel(沒有活動文檔),然後調用app.Run(mainWindow);
。
我在完成此是掛鉤的處理程序的mainWindow.Loaded
事件,並把新的/打開的文檔邏輯那裏(執行由視圖模型,被掛在所述相同的那些暴露的New
或Open
命令初始嘗試我們的應用程序菜單中的新建和打開按鈕)。但是,Loaded
事件在窗口顯示之前觸發,這是一個問題,因爲可能會打開舊格式的現有文檔,我們需要向用戶顯示提示,詢問他們是否希望我們升級他們的文件(類似於Visual Studio具有用於以舊格式升級解決方案的嚮導,以及創建備份的選項)。這些提示必須顯示爲模態窗口,它們是主應用程序窗口的子窗口。
有關實施此類行爲的最佳實踐的任何建議?
編輯
在這個特定的實現底層的問題是如何知道確定性當主窗口中完全呈現,並顯示在屏幕上,事後執行一些代碼。從閱讀SO和其他地方的其他問題,聽起來像沒有官方/內置的方式來做到這一點?我已經閱讀過有關使用Dispatcher調用低優先級的委託,以便它在渲染完成後纔會發生,但這看起來像是黑客攻擊,更不用說與線程上下文切換相關的性能問題。這就是說,我接受其他建議如何實現所需的行爲(創建一個新的/打開一個現有的文件之後窗口已被顯示)。
你確定在顯示窗口之前加載了嗎?我剛創建了一個簡單的測試應用程序,在Window.Loaded中顯示一個MessageBox,並按照以下順序進行:Visible Changed,Activated,Loaded。到Loaded被調用時,窗口對用戶是可見的 – cordialgerm
@pickles:有趣的。在我的實際應用中,Loaded在激活之前觸發。但是,在我剛剛創建的測試應用程序中,我得到了與您所做的相同的結果:在加載之前激活。不知道有什麼區別... – mjl5007
@pickles:原來是這個窗口。我們使用Actipro的'RibbonWindow',而不是WPF的'System.Windows.Window',並且啓動行爲是不同的。只需將測試應用程序從WPF的'Window'切換到Actipro,就可以使它像我們的應用程序一樣。啊。 – mjl5007