地味にかなりハマったので、備忘録として残しておきます。
シチュエーションとしては、以下の感じです。
- プロジェクトは WPF を前提
- ユーザーコントロール(
MyUserCtrl.xaml
)を含むクラスライブラリとしてプロジェクトAがある - プロジェクトAを参照したエントリーポイント(
App.xaml
)を持つプロジェクトBがある - プロジェクトBからプロジェクトAのユーザーコントロールを呼び出す
ここで、プロジェクトAの MainWindow にて最初は単純に以下のように記述していました。
<Window x:Class="ProjectA.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ProtobufAnalyzer.DebugWpf"
xmlns:pb="clr-namespace:ProjectB"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<pb:MyUserCtrl>
</pb:MyUserCtrl>
</Grid>
</Window>
コンパイルすると以下のようにコンパイルエラーになります。
error MC3074: タグ 'MyUserCtrl' は、XML 名前空間 'clr-namespace:ProjectB' にありません。
ちゃんと xmlns:pb="clr-namespace:ProjectB"
というように名前空間を追加しているのに!
名前空間 ProjectB
に MyUserCtrl
はあるのに!
間違いなくプロジェクトBの参照にプロジェクトAを追加しているのに!
どうしろというのだ・・・
ググってもググり方が悪いのか、特に有力な情報は得られず・・・
30分以上格闘して、自分が作った過去の wpf アプリのソースを見ていたら解決策が見つかりました。(というか、過去のアプリは無意識のうちに?ちゃんとできてました)
結果的には、以下のように名前空間の後に assembly=***
を追加しなければならないようです。
<Window x:Class="ProjectA.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ProtobufAnalyzer.DebugWpf"
xmlns:pb="clr-namespace:ProjectB;assembly=ProjectB"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<pb:MyUserCtrl>
</pb:MyUserCtrl>
</Grid>
</Window>
こんなんわかるわけないやん・・・
せめてエラーとかもうちょっと直感的にわかるようなやつが出てくれれば・・・
と恨み節ですが。
コメント