0

まず、C#、WPF、デスクトップ アプリケーション (.NET 3.5 の場合もあります) を使用します。

アプリケーションの起動時にログイン ウィンドウを表示し、ログインが成功した場合は、ログイン ウィンドウを非表示にしてメイン アプリ ウィンドウを表示する必要があります。さらに、メイン ウィンドウを閉じると、ログイン ウィンドウが再び表示されます。ログイン ウィンドウを閉じると、アプリケーションが終了します。

さらに難しくするボーナス: 「ユーザーを記憶する」オプションがチェックされている場合、ログイン ウィンドウはスキップされ、ユーザーは自動的にログインし、メイン ウィンドウがすぐに表示されます。(オプションがどのように格納されるかについては考えないでください。それを知っていて、変数に値があると仮定してください)。

アプリケーションの開始点とは何ですか (app.xaml の StartupUri プロパティにあると見なされるウィンドウを意味します)。

アーキテクチャをどのように解決しますか? App_Startup イベントを使用して、その時点からいくつかのウィンドウを表示する最良の方法はありますか?

どのタイプの App.ShutdownMode を使用しますか? そして、それはどのように機能しますか?「OneLastWindowClose」、「OnMainWindowClose」、または「OnExplicitShutdown」を使用できます。あなたの選択は何ですか、なぜですか?

一般的に、私は「何が何を呼び出し、アプリケーションの「ルート」とは何か、アプリケーションを閉じることを呼び出すもの」に興味があります。

問題の解決策は既にありますが、興味があります。この問題に遭遇したことがある人や、どのように解決しましたか? 私のアプローチを喜んで共有しますが、そもそもあなたのアイデアを制限したくありません.

ご協力いただき、ありがとうございます。

PS:私はMVVMフレームワークを使用しているため、少し面倒ですが、要点は変わりません。Ninject も IoC として使用していますが、もちろんこの問題は解決していません。質問をできるだけ明確にするために、これらの情報については言及しませんでした。また、例外を処理する必要があります (ログイン中のサーバーまたはデータベースとの通信が失敗する可能性があります)。さらに興味深いものにするために、アプリケーションの動作 (ロード、サーバーとの通信、自動ログイン) を示すインタラクティブな「スプラッシュウィンドウ」を表示する必要があります。ただし、現時点ではこれらの要件には近づかないようにしてください。後で説明します。

4

2 に答える 2

1

私はあなたの質問を理解しているので繰り返します。何か欠けているところを修正してください。また、私は MV-VM 全体にかなり慣れていないので、私のアドバイスは大目にみてください。学ぶ方法を私が知っている最善の方法は、自分の考えを捨てて、修正してもらうことです。

知りたいこと 1) ログインまたはメイン ウィンドウを表示する場所を決定するロジックはどこに存在する必要があるか 2) どのシャットダウン モードを使用するか 3) アプリケーション ルートとは

1)ログインまたは自動ログインを表示する決定はビジネスロジックであるため、MV-VM フレームワークのモデルに含める必要があると思います。そのロジックが実装されると、モデルにクエリを実行することで、ビューは必要なウィンドウを表示できます。

アプリケーションには、アプリケーションの実行時に実行される App.xaml および App.cs ファイルがあると想定しています。App.cs 内で OnStartup をオーバーライドし、ビジネス ロジックの結果 (モデル内のオブジェクトを使用して学習したもの) に基づいて、必要なウィンドウを表示できます。

2) シャットダウン モデルについては、おそらく OnLastWindowClose を使用しますが、アプリケーションが使用しているウィンドウの数がわかりません。あなたが言及した2つ(ログインとメイン)のみを想定しています。

3) アプリケーションルートとは? モデルは、すべての重要なものを保持しているという点で、実際にはアプリケーションのルートであると主張します (ビューはモデルへのユーザー インターフェイスであり、ビュー モデルはビューの状態です)。したがって、アプリケーションの根本または本質とは何かということになると、それはモデル内のオブジェクトのセットであると私は主張します。

何が何を呼ぶ?それはすべて、達成しようとしていることに依存します。一般に、ビュー モデルがビューについて何も認識しないようにします。ビューとビュー モデルの両方がモデルを認識することができます。場合によっては、Ninject をサービス マネージャーとして使用して、ビュー モデルにビューを挿入する必要があります (ビュー モデルがビューに依存することを強制する必要はありません)。


まったく別のアプローチは、ログイン ウィンドウを完全に回避し、メイン ウィンドウにログイン方法を表示することです。ログイン プロンプトをいつ表示するかを通知する Model オブジェクトが必要ですが、ウィンドウのジャグリングについて心配する必要はありません。正直なところ、私はおそらくその道を行くでしょう。WPF は、そのタスクを達成するための興味深い方法を数多く提供してくれます。

于 2010-09-16T13:10:29.057 に答える
0

Applicationオブジェクトは、WPFプロジェクトのルートです。もちろん、起動時に何をする必要があるかに応じて、App_Startupイベントを処理できるのは正しいことです。

より複雑なナビゲーションフレームワークが必要かどうか、またはアプリケーションが説明したシナリオに永久に制限されるかどうかに応じて、そこからさまざまな方法で進むことができます。

私が取り組んでいるアプリケーションで行っているのは、異なるウィンドウ間とウィンドウ内の両方のナビゲーションを処理するNavigatorオブジェクトを作成し、それを呼び出すだけNavigator.Navigate(new MyViewModel(), NavMode.ReplaceWindow);で、前の「メイン」ウィンドウ(開いている場合)を閉じて、新しいウィンドウを表示することです。 1つは、コンテンツをViewModelのインスタンスに設定することです。次に、正しいテンプレートを使用してViewModelが表示されます。NavMode.ReplaceUserControl現在の「メイン」ウィンドウの内容を置き換えるもの、またはNavMode.OpenModalWindowモーダルダイアログを表示するものを使用することもできます。ShutdownModeはOnLastWindowCloseに設定されてApp.Shutdown()います。これは、開いているウィンドウに関係なく、閉じたい場合はいつでも呼び出すことができるためです。

もちろん、ウィンドウを置き換えるときは、ウィンドウがなくなったためにアプリケーションがシャットダウンしないように、古いウィンドウを閉じる前に、必ず新しいウィンドウをインスタンス化する(表示せず、インスタンス化するだけ)必要があります。

同様のことを行うこともできますが、それは単なるアイデアであり、私の要件に合わせて特別に調整されています。

于 2010-09-16T13:11:23.667 に答える