MVVMとDIを使用するWPFアプリケーションの起動中に、新しい/空のドキュメントを作成するか、既存のドキュメントを開くためのロジックを実装する方法についてのガイダンスを探しています。
明確にするために、私が話している動作は、WordやExcelなどのOfficeアプリケーションを起動するときに見られる一般的な動作です。アプリケーションを直接起動すると([スタート]メニュー、タスクバー、デスクトップショートカットなど)、新しい空白のドキュメントまたはスプレッドシートが作成されます。ただし、既存の.docxまたは.xlsxファイルをダブルクリックすると、アプリケーションが起動し、代わりに既存のドキュメント/スプレッドシートを開き、新しいドキュメントの作成を完全にバイパスします。
このアプリケーションの場合、新しい空のドキュメントを作成するか、既存のドキュメントを開く(コマンドライン引数として渡される)ロジックを実行する前に、ドキュメントを開かずにアプリケーションウィンドウを表示する必要があります。
現在、で構成されているIoCコンテナーを使用しておりint Main(string[])
、メインアプリケーションのViewModel(アクティブなドキュメントなし)をメインウィンドウのコンストラクターに挿入してから、を呼び出しますapp.Run(mainWindow);
。
これを達成するための私の最初の試みは、ハンドラーをmainWindow.Loaded
イベントに接続し、そこに新しい/開くドキュメントロジックを配置することでした(ViewModelによって公開されたNew
またはOpen
コマンドを実行します。これは、アプリケーションの[新規]ボタンと[開く]ボタンに接続されているものと同じです)。メニュー)。ただし、Loaded
ウィンドウが表示される前にイベントが発生します。これは、古い形式の既存のドキュメントが開かれている可能性があるため問題であり、ユーザーにアップグレードを希望するかどうかを尋ねるプロンプトを表示する必要があります。ファイル(Visual Studioに、バックアップを作成するオプションを備えた、古い形式のソリューションをアップグレードするためのウィザードがあるのと同様です)。これらのプロンプトは、メインアプリケーションウィンドウの子であるモーダルウィンドウとして表示する必要があります。
このタイプの動作を実装するためのベストプラクティスに関する提案はありますか?
編集
この特定の実装では、根本的な問題は、メインウィンドウが完全にレンダリングされて画面に表示されるタイミングを決定論的に認識し、後でコードを実行する方法です。SOや他の場所で他の質問を読んだことから、それを行うための公式/組み込みの方法がないように思えますか?レンダリングが完了するまで発生しないように、ディスパッチャーを使用して優先度の低いデリゲートを呼び出す方法について読みましたが、スレッドコンテキストの切り替えに関連するパフォーマンスの問題は言うまでもなく、ハックのようです。
そうは言っても、目的の動作を実装する方法(ウィンドウが表示された後に新しいドキュメントを作成する/既存のドキュメントを開く)に関する他の提案を受け入れることができます。