[.NET Core] .NET Frameworkから.NET Coreに移行したカスタムコントロールが動かなくなった

移植作業をしていたら動作しなくなって困ったときの話です。
ビルドエラーはでなくて実行時エラーになっていたので原因がわからなくてハマりました。
OnApplyTemplates()が呼ばれていないことに気付いて判明しました。

スポンサーリンク

結論

AsssemblyInfo.csに以下の内容を書きましょう。

using System.Windows;

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
                                     //(used if a resource is not found in the page,
                                     // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
                                              //(used if a resource is not found in the page,
                                              // app, or any theme specific resource dictionaries)
)]

ThemeInfoの設定がないと、カスタムコントロールの読み込みが行われずに実行時エラーが出ます。

なぜ書いてないのか

場所が変わってる

.NET CoreになってからAssemblyInfo.csの場所が変わっています。
.NET FrameworkではPropertiesの中にいましたが、.NET Coreではソリューション直下に直接置かれるようになります。

手動で移行していたので自動生成されてない

普通に作っていれば、メニューから新規作成でカスタムコントロールを作ると思います。
これを実行するとAssemblyInfo.csが生成され、この中には上記の設定がちゃんと書かれています。
インポート時やビルド時に、ソリューションを解析して自動生成されるわけではないので見落としていました。

おしまい。

スポンサーリンク