【WPF】プロジェクト間の画面遷移における値の受け渡しと画面のDLL化

当ページのリンクには広告が含まれています。

WPFで複数の画面を連携させるようなプログラムを作成する場合、画面間で何らかの値を受け渡しする必要が生じます。

今回は、面遷移におけるデータ連携と、画面をDLL化して再利用できるようにする方法について解説したいと思います。

ちなみに、記事のタイトルに「プロジェクト間」と記載していますが、プロジェクト内にあろうが無かろうが、画面の遷移方法、値の受け渡し方法は全く同じです。

目次

サンプルプログラムの概要

ボタンをクリックすると子画面に遷移し、子画面で押されたボタンや入力された文字列を返すというシンプルな画面のサンプルです。

今回はダイアログという形で画面遷移を行っていますが、もっと複雑な画面に遷移して値を受け渡しする場合も全く同じです。

サンプルプロジェクトのダウンロード

サンプル画面のプロジェクト一式は下記からダウンロードできます。

画面の呼び出し方法

例えば、MessageDialog という名前でWindowを作成したとします。

この場合は次の様になります。

dlg.ShowDialog() はモーダル(表示したウィンドウ以外は操作できない)状態で開きますが、dlg.Show() にするとモードレス(表示したウインドウと呼び出し元のウィンドウの両方が操作できる)状態になります。

今回のサンプルソースでは、引数に親画面のWindowと表示したい文字列を渡して画面呼び出し(画面遷移)をしていますが、これは子画面(遷移先)のコンストラクタで2つの引数を受け取るようにしているからです。

わざわざ第一引数に呼び出し元のWindow(this)を渡しているのは、親画面の中央に子画面を表示させたいという理由です。

画面遷移における値の受け渡し方法

呼び出し先(遷移先)へ値を渡して、遷移先で処理された値を受け取る方法は下図の様にいくつかの方法が考えられますが、サンプルでは一番シンプル且つ一般的な方法として、プロパティとDialogResult を採用しています。

値の渡し方

遷移先への値の渡し方は、コンストラクタかプロパティを使います。

例えば、サンプルプログラムでは ImputDialog というWindowを作成していますが、ここではコンストラクタとプロパティを使って値のやり取りをしています。

値の受け取り方

DialogResultは、ShowDialog() メソッドで表示した場合にのみ有効な値の受け取り方で、 true 、 false、null の3種類しか値を返すことが出来ませんが、Windowの戻り値として受け取ることが出来ます。

オリジナルのダイアログボックスを用意したい場合や、遷移先の操作が有効(又は確定)か無効(又は中止)かを判定したい場合はDialogResult が便利です。

一方、4個以上のボタンがあってどれを押されたかを識別したい場合や、文字列や数値、或いは何らかのオブジェクトを受け取りたい場合は、プロパティを利用するのが一番簡単です。

例えば、下記は uxImputText と言う名前のテキストボックスがあって、その中身(編集結果)を呼び出し元に返す場合のサンプルです。

プロパティを使うと、呼び出し側から初期値をセットすることが出来るというメリットもあります。

画面のDLL化と呼び出し方法

何故記事のタイトルに「プロジェクト間」という文言を入れたかと言うと、画面をDLL化して再利用したいからです。

再利用したい画面を別プロジェクトに固めておくと、他のプロジェクトで使う場合の取り回しが楽になるため、あえてこうしました。

さて、画面をDLLにすると何が嬉しいかと言うと、Windowを1つの部品として取り扱えるようになるからです。

実行ファイル(EXE)のまま再利用するのであれば、System.Diagnostics.Process.Start()を使って呼び出す必要がありますし、値の受け渡しはファイルを経由するか、共有メモリを利用するか、プロセス間通信を利用するか、いずれにせよ面倒な手順を踏まなければなりません。

しかし、DLLにしておけば既存のクラスのインスタンスを生成して、プロパティやメソッドで値の受け渡しが出来る様になるため、面倒な処理は必要無くなります。

ただ、残念なことに、画面をDLL化するには、少しだけ手を加えてあげる必要があります。

画面をDLL化するための方法

画面の作り方は従来通り、プロジェクト名の右クリック⇒追加⇒ウィンドウ(WPF)で新しいWindowを作ってあげるだけなのですが、DLL化したい画面が入っているプロジェクトのプロパティと、App.xaml のプロパティについて、それぞれ1か所つづ次の様に変更します。

最初に、Visual Stuidoの一番上にあるメニューから「プロジェクト」をクリックし、表示されるメニューの一番下にある「○○○○のプロパティ」を選択します。

するとアプリケーションのプロパティが表示されるので、出力の種類を「クラスライブラリ」に変更して下さい。

続けて、今度はDLL化したい画面が入っているプロジェクトの中にApp.xaml というファイルがあるので、これをクリックして、プロパティのビルドアクションを「なし」に変更します。

ビルドアクションを「なし」に変更せずにビルドするとビルドエラーになりますので、必ず「なし」に設定して下さい。

以上の設定を行うと、DLL化したい画面が入っているプロジェクトをビルドしても、EXEではなくDLLが生成されるようになります。

DLL化した画面の呼び出し方

別プロジェクトに含まれている画面を表示することになるので、参照設定が必要となります。

次の図の通り①、②、③、とクリックし、④でチェックを入れて、⑤をクリックすれば完了です。

この操作を行った後、C#のソースコード上で using を記述すれば、後は普通のWindowと全く同じ手順で呼び出しが可能です。

例えば、今回のサンプルでは、名前空間(namespace)が MyMessageBox になっていますので、冒頭に次の1行を記述しておきます。

後は、次の様に通常のWindowを呼び出す手順で画面遷移が行えます。

サンプルソースの解説

それでは、実際のソースコードを載せておきます。

遷移元(親画面)の画面イメージ

遷移元(親画面)のXAML

遷移元(親画面)のC#コード

遷移先(子画面) MessageDialogの画面イメージ

遷移先(子画面) MessageDialogのXAML

遷移先(子画面) MessageDialogのC#コード

遷移先(子画面) ImputDialogの画面イメージ

遷移先(子画面) ImputDialogのXAML

遷移先(子画面) ImputDialogのC#コード

まとめ

今回はWPFにおける画面(Winodw)の遷移方法と、その際の値の受け渡し方法、そして画面のDLL化について解説しました。

画面をDLL化する方法としてユーザーコントロールがありますが、ユーザーコントロールは画面に張りけて使うものであるため、必ず土台となるWindowが必要となります。

その点、WindowをDLL化しておけば、呼び出すだけで事が足りてしまうため、かなり便利になります。

ログイン画面やメッセージ系のダイアログ画面など、ちょっとした画面をDLL化するだけでも効果はありますので、是非お試しください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次