Visual Studio 2015(Community Update2)で、WPF + Prism 5 を使ってアプリケーションを開発中、XAML デザイナーで Prism の InteractionRequestTrigger
を使い、自作のアクション クラスをトリガーに設定すると、ビルド エラーが発生する問題が起こりました。
もくじ
現象
次の XAML で問題が起こりました。
<i:Interaction.Triggers>
<prism:InteractionRequestTrigger ...> <!-- 【1】Prism 5 の InteractionRequestTrigger -->
<my:FooAction ... /> <!-- 【2】自作のアクション、別アセンブリに定義されている -->
</prism:InteractionRequestTrigger>
</i:Interaction.Triggers>
まず、上記【1】の InteractionRequestTrigger
を宣言している箇所で、次のビルドエラーが発生します。
ローカル プロパティ "Actions" は "TriggerBase" の派生型でのみ使用できます。
英語では:
The local property "xxx" can only be applied to types that are derived from "TriggerBase".
さらに、【2】の FooAction (自作のアクション) を宣言している箇所で、次のビルドエラーが発生します。
アセンブリ '(アセンブリ名)' からの型 'FooAction' は Blend SDK の古いバージョンでビルドされているため、Windows Presentation Framework 4 プロジェクトではサポートされません。
英語では:
The type 'xxx' from assembly 'xxx' is built with an older version of the Blend SDK, and is not supported in a Windows Presentation Framework 4 project.
また、ビルド エラーが発生しているため XAML デザイナーのデザイン ビューの画面が「無効なマークアップ」となり、アプリケーションの UI が表示されなくなります。
エラー メッセージの内容から、参照アセンブリや Prism のバージョンに問題があるのか思い調べたのですが、特に問題はなさそうでした。ちなみに、System.Windows.Interactivity.dll
のアセンブリ バージョンは 4.5.0.0、ファイル バージョンは 3.0.40218.0 でした。また、Prism は 5 を使用しています。自作のアクションも、これらのアセンブリを参照してビルドされている事を確認しました。
また、アプリケーションを実行して、当該のトリガー・アクションが実行される操作をしても、特に問題なく動きます。どうやらデザイン時のみ問題が発生している様子です。
なお、Visual Studio を起動した直後は、XAML デザイナーのデザイン ビューが「無効なマークアップ」とはなっておらず、アプリケーションの UI はきちんと表示されています。ところが、ビルドしたタイミングで上記のエラーが発生して、「無効なマークアップ」となります。たまにビルド エラーが発生しないこともあったりして、よくわからない動きです。
回避方法
アプリケーションを実行する上では問題が無いものの、デザイン時にエラーが表示されているのは気持ち悪いですし、デザイン ビューが使えないのはかなり不便です。そこで原因と回避方法を調べたところ、次のページが見つかりました。
XAML designer will not display when using Blend SDK Behaviors – Visual Studio Connect フィードバック センター
結論としては、System.Windows.Interactivity.dll
をグローバル アセンブリ キャッシュ(GAC)に登録すると問題が発生しないようになったということのようです。
そこで、コマンド プロンプトを管理者として実行し、gacutil にてアセンブリを GAC に登録しました。
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\gacutil.exe" -i
"C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.5\Libraries\System.Windows.Interactivity.dll"
アセンブリを GAC に登録した後、Visual Studio を再起動すると、ビルド エラーが発生しなくなりました。しかし、根本原因がなんなのか今もわかっていません。ご存じの方がおられましたら、教えていただけるとうれしいです。