WPF で外部のプロジェクトからユーザーコントロールとかを参照する方法

地味にかなりハマったので、備忘録として残しておきます。

シチュエーションとしては、以下の感じです。

  • プロジェクトは 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" というように名前空間を追加しているのに!
名前空間 ProjectBMyUserCtrl はあるのに!
間違いなくプロジェクト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>

こんなんわかるわけないやん・・・
せめてエラーとかもうちょっと直感的にわかるようなやつが出てくれれば・・・
と恨み節ですが。

コメント

タイトルとURLをコピーしました