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"
というように名前空間を追加しているのに!
名前空間 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>
こんなんわかるわけないやん・・・
せめてエラーとかもうちょっと直感的にわかるようなやつが出てくれれば・・・
と恨み節ですが。