前回の記事で標準コントロールを継承したカスタムコントロールを作成しました。
しかし、せっかく作成したカスタムコントロールを別アプリケーションでも使いたくなるのが人情。カスタムコントロールを共通ライブラリ(dll)にまとめ、別々のアプリケーションで共用するということが良くあります。
この記事では前回作成したカスタムコントロールを共通ライブラリ(dll)に再定義し、共通ライブラリ内のコントロールを参照・使用する方法を解説します。
- コントロールを共通ライブラリに外出しする方法
- 別プロジェクトで定義したコントロールを使用する方法
作成するプロジェクト構成(ゴール)
以下の構成とします。前回の記事で作成したカスタムコントロールを別プロジェクトに移動する感じです。
1.共通ライブラリの作成
共通ライブラリソリューションの作成と、カスタムコントロールのソースコードについて解説します。ソースコードについては前記事からの差分のみ記載します。
(カスタムコントロールを使用する画面と同一/別プロジェクトそれぞれに定義する場合のソース差異をメインに説明します)
共通ライブラリソリューションの作成
(分かる人は飛ばしてOK)
別アプリケーションからも参照したい関係上、既存アプリケーション内にプロジェクトとして作成するのではなく、独立したWPFクラスライブラリソリューションとして作成します。
- ファイル(F) ⇒ 新規作成(N) ⇒ プロジェクト(P)… から新しいプロジェクトをの作成ダイアログを表示します。
- WPFクラスライブラリを選択し、作成します。(ソリューション名はとりあえず『WpfLibrary』としました。場所とかはまあ適当に)
カスタムコントロールの作成
CustomTextBoxのソースコード(.cs/.xaml)およびGeneric.xamlを追加します。内容は前記事通りとし、以下の点だけ変更します。(Generic.xamlはカスタムコントロール生成時に自動生成されたファイルを編集します)
CustomTextBox.xaml
変更なし。
CustomTextBox.cs
名前空間だけ変更します。(AppProjectからWpfLibraryに移動したので。名前は適宜変更してください。この例では AppProject.Controls ⇒ WpfLibrary.Controls)
Generic.xaml
『名前空間(xmlns)』と『ResrouceDictionaryのSourceパス』を修正します。
- 名前空間(xmlns)
CutomTextBox.csの名前空間をWpfLibrary.Controlsに変更したため、参照しているここを修正します。 - ResrouceDictionaryのSourceパス
Source=”/AppProject;component/Controls/Styles/CustomTextBox.xaml”
↓
Source=”pack://application:,,,/WpfLibrary;component/Controls/Styles/CustomTextBox.xaml”
変更点を赤字にしています。
pack://application:,,,は『アセンブリ(dll)を参照するよ』的な意味です。,,,とカンマが3つ続いていますが、これは何かを省略しているわけではありません。マジでこういう書き方です。
その後に/区切りでアセンブリ名を記載します。今回はWpfLibrary.dllなのでWpfLibraryと書きます。
;conponent/はローカルのdllを見るよということのようです。それ以降は読み込むxamlファイルのWpfLibrary内での相対パスを記述します。
詳細は以下の公式リファレンスをご参照ください
2.共通ライブラリを参照する設定
共通ライブラリの参照
作成した共通ライブラリをアプリ側のソリューションから参照します。
- アプリ側ソリューション(AppProject)にライブラリプロジェクト(WpfLibrary)を追加ソリューションエクスプローラーにてソリューション名を右クリック ⇒ 追加(D) ⇒ 既存のプロジェクト(E)… よりWpfLibraryのプロジェクトファイル(.csproj)を選択
ソリューションにWpfLibraryが追加されました。 - AppProjectプロジェクトにWpfLibraryを参照追加ソリューションエクスプローラーにて参照追加先のプロジェクト名(AppProject)を右クリック ⇒ 追加(D) ⇒ プロジェクト参照(R)… よりWpfLibraryを選択
直前にAppProjectソリューション内にWpfLibraryを参加させているので、プロジェクトツリーに表示されているはず。
共通ライブラリの名前空間(xmlns)の記述を修正
カスタムコントロールを使用するアプリ側ソリューションの画面のxamlファイルにて、共通ライブラリ上の名前空間を参照するように修正します。
xmlns:ctrls=”clr-namespace:AppProject.Controls”
↓
xmlns:ctrls=”clr-namespace:WpfLibrary.Controls;assembly=WpfLibrary”
変更点を赤字にしています。
追記している;assembly=dllNameは別dllを参照する際に付与し、参照するアセンブリ名(Dll名)を記載します。
今回はWpfLibrary.dllを参照するため、;assembly=WpfLibraryとなります。
まとめ
ここまでの修正により、カスタムコントロールを別プロジェクト化して使用することができるようになりました。
また、別プロジェクトのコントロールを参照する場合、
- 参照する共通ライブラリdllの指定
を行えば同一プロジェクト内に定義したように使用可能であることが分かります。
プロジェクトの構成は後の開発しやすさに重大な影響を与えます。ライブラリ用のプロジェクトを作成するなど、再使用性を高める設計を頑張りましょう!
勉強中の身ですので、誤りや不備等ありましたらご指摘いただけますと幸いです。