あるところのユーザーコントロールを自分のWPFプロジェクトに組み込んだんですが、デザイン画面で「型’hoge’のインスタンスを作成できませんでした。」となり、表示してくれない。このエラーを調べると、以下がヒットした。
型 '{0}' のインスタンスを作成できませんでした。
http://msdn.microsoft.com/ja-jp/library/bb907334.aspx
このページを引用すると
----- 引用開始 ------
このエラーは、XAML コンパイラが指定された型をインスタンス化できなかったときに発生します。これは通常、型のコンストラクタに例外が発生していることが原因です。
----- 引用終了 ------
そのままやん。orz
う~ん、一体どこが悪いんだろう・・・。とりあえずそこがわからなきゃ話にならない。で、どうやって調べようか・・・。
少しネットを漁ると、とりあえずここが参考になりそうだ。
チュートリアル : デザイン時の WPF カスタム コントロールのデバッグ
http://msdn.microsoft.com/ja-jp/library/bb514636.aspx
このチュートリアルにそってデバッグすると、何とか原因がわかった。ちなみにこのチュートリアルにある装飾プロバイダクラスの中身は今回空にした。インスタンス時にどこでエラーが発生しているかどうかだけが知りたかったものですから。
で、その原因というのは、ユーザーコントロールのXAMLにおいてStaticResourceが見つからないと言われている。 なぜ? 実行時にはちゃんと解決してるじゃない。と思って調べると、
WPF デザイナ読み込みエラーのトラブルシューティング
http://msdn.microsoft.com/ja-jp/library/bb546934.aspx
に
----- 引用開始 ------
デザイン時の UserControl とカスタム コントロール リソース
App.xaml 内のリソースは、ページまたはウィンドウに読み込まれた UserControl やカスタム コントロール インスタンスでは使用できません。
----- 引用終了 ------
と書いてある。で、その対策は、
----- 引用開始 ------
リソースをデザイン時に使用するには、リソースを単独のリソース ディクショナリに組み込み、このディクショナリを App.xaml とコントロールの XAML に含めます。すべての StaticResource 参照を DynamicResource 参照に変更します。リソースをデザイン時に使用可能にするためにリソース ディクショナリを共有する方法のコード例を次に示します。
UserControl1.xaml
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
App.xaml
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
----- 引用終了 ------
というわけで何とか解決しました。