Top > Programming > .NetFramework > WPF > ErrorInClassLibraryProject
Last-modified: Tue, 11 Jun 2013 09:03:44 JST
Counter:6009 Today:5 Yesterday:5 Online:12
このエントリーをはてなブックマークに追加

XAMLを含むクラスライブラリプロジェクトを作る際の注意

About

XAMLを用いて定義されるユーザコントロールやカスタムコントロールを、再利用や整理のためにDLLにする場合があります。ふつうクラスライブラリプロジェクトに実装済みのそれらを追加しますが、ドラッグアンドドロップや複製(コピー&ペースト)によってプロジェクトに追加するなどしていると、不具合を起こす可能性があります。またそれ以外にも既存のリソースをクラスライブラリプロジェクトに移す際に起こしうる不具合が多々あるので、ここではそれらについてまとめて解説します。

VisualStudio2012、.netframework4.5時点の記事です。

エラー「ApplicationDefinition要素を指定できません」

ビルドを実行した際に、プロジェクト全体を通じて「ライブラリプロジェクトファイルは、ApplicationDefinition要素を指定できません。」というエラーが返されることがあります。[出力]や[エラー一覧]にはエラーを発生しているファイルなどが通知されないので、原因を特定するのが困難です。

ふつう、XAMLファイルの[ビルドアクション]が"ApplicationDefinition"に設定されている場合にこのエラーが発生します。外部からのドラッグアンドドロップや複製によってXAMLファイルがプロジェクトに取り込まれると、標準では"ApplicationDefinition"に設定されてしまうようです。これをクラスライブラリなどで標準の"Page"に書き換えることで問題が解決する可能性があります。

設定の変更は[プロパティ]から行います。プロパティウィンドウが表示されていない場合、[ソリューションエクスプローラ]からXAMLファイルを右クリックして、メニュー[プロパティ]を表示します。項目[詳細]から[ビルドアクション]を変更します。

注意しなければいけないのは、カスタムコントロールなどを定義する「Generic.xaml」なども"Page"に設定される必要がある点です。XAMLファイルは一通り見直したほうが良いと思います。

Generic.xamlを修正する

ふつうGeneric.xamlにはカスタムコントロールの定義が記述されていますが、既存のGeneric.xamlを新規のプロジェクトに複製するとき、多くの場合には記述を修正する必要があるので注意が必要です。修正する内容は名前空間であったりカスタムコントロールを定義するXAMLの参照先であったりします。

一見当たり前のことに見えますが、Generic.xamlの修正を行わなくてもプロジェクトのビルドが完了してしまう、という問題があります。例えば参照先に対象とするファイルが存在しなくてもエラーが通知されないため、修正しないことによって引き起こされる問題の原因がどこにあるのか分からなくなる可能性があります。VisualStudioプロジェクトや.netframeworkがどのような手順でxamlファイルやGeneric.xamlを参照しているかは定かではありませんし本質的な問題ではないので割愛します。

この問題は該当するプロジェクトにカスタムコントロールを新規に生成するなどした場合に解決する可能性があります。※解決するのでしょうが、確認していません。

カスタムコントロールがレンダリングされない

カスタムコントロールを定義するxamlを新しいクラスライブラリプロジェクトに移植し、ビルドが正常に終了したにもかかわらず、対象のカスタムコントロールを実装側から呼び出しても、カスタムコントロールが正常に描画されない場合があります。描画領域は設けられますが、カスタムコントロールに含まれるすべてのコンポーネントが描画されず、Backgroundプロパティなどのせっていも反映されないような状況です。

この問題は何に起因するものなのか推察するだけの情報もありません。しかしながら新しいクラスライブラリプロジェクトにカスタムコントロールを[新しい項目]から新規に追加し、Generic.xamlファイルに新しいカスタムコントロールの情報を書き加えることによって解決されることを確認しています。新しいカスタムコントロールを追加した後、一度ビルドを実行して、生成されたDLLから参照されるカスタムコントロールが正常に描画されることを確認したら、追加したカスタムコントロールを削除します。

App.xamlやApp.xaml.csを削除する

App.xamlやApp.xaml.csがクラスライブラリプロジェクトに含まれることはふつうありません。これを原因とするエラーが発生している場合にはプロジェクトから削除してしまいます。