0

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や他の場所で他の質問を読んだことから、それを行うための公式/組み込みの方法がないように思えますか?レンダリングが完了するまで発生しないように、ディスパッチャーを使用して優先度の低いデリゲートを呼び出す方法について読みましたが、スレッドコンテキストの切り替えに関連するパフォーマンスの問題は言うまでもなく、ハックのようです。

そうは言っても、目的の動作を実装する方法(ウィンドウが表示された後に新しいドキュメントを作成する/既存のドキュメントを開く)に関する他の提案を受け入れることができます。

4

1 に答える 1

0

Just recording this for future folks..

Are you sure loaded is being fired before the Window is shown?

I just created a simple test app showing a MessageBox in Window.Loaded and it's happening in the following order:

Visible Changed Activated Loaded

By the time Loaded is called the Window is visible to the user

Update from OP:

Turns out it's the window. We're using Actipro's RibbonWindow, not WPF's System.Windows.Window, and the startup behavior is different. Just switching the test app from WPF's Window to the Actipro one makes it behave like our application. Ugh

于 2012-08-24T16:00:10.400 に答える