tmori3y2のブログ

主にWindowsのプログラムなど

初心者が迷ったSystem.Windows.Interactivityの困ったちゃん二連発

Blend SDKのSystem.Windows.Interactivityにはお世話になっています。

イベントをコマンドに変換するときは、

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

とか、

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

とか書いていると思います。

自作のTriggerActionとか作らなければ、XAMLだけでしかSystem.Windows.Interactivityを使っていないとか有るんじゃないかと思います。

XAMLだけでしか使わないアセンブリはいろいろ事故が起こるみたいですよ」

「アプリとコントロールが同じプロジェクトなら問題ないですが、UserControlがかなり怪しいです」

「デザインモードでXamlParseExceptionとか出たりします」

「相互運用時もかなり怪しいです」

stackoverflow.com

「困った時はおまじないがききます」

private bool assemblyLoaded { get; set; }

public UserControl1
{
   assemblyLoaded = typeof(System.Windows.Interactivity.Interaction) != null;
   //var assemblyLoader = typeof(System.Windows.Interactivity.Interaction); // Debug版のみで有効
   InitializeComponent();
}

XamlPaeserはアセンブリのルートではなくプロセスのルートから参照アセンブリを探しているみたいです。

その証拠に、WPF UserControlを張り付けたWindows Forms UserControlをスタートアッププロジェクトにした時にIDEフォルダにあるUserControlTestContainerの起動に失敗する場合がありますが、IDEフォルダに読み込みに失敗したアセンブリをコピーするとデバッグすることが出来るようになります。

このため、参照アセンブリがbin\DebugにコピーされていてもInitializeComponent()を実行する前にロードされていないと読み込みに失敗します。

(2016/02/09追記)

「あと、NuGet Package入れたら、参照に入ってほしいですよね・・・」

stackoverflow.com

「NuGet.orgのSystem.Windows.Interactivity怪しすぎ・・・」

「そもそも、author Microsoftってどこまで信用できるの?」

「『安心してください!!はいってます』 (MVVM Light)って入れてもいいんだけ?」

「そういえば、Livetにも入ってますね・・・」

VS2013だとBlend SDK入ってるのに、NuGet Packageに入ってるとリポジトリの奴に依存関係が付くのが気持ち悪い・・・

「FrameworkのExtensionsなんだから、なぜ.nuspecに一行入れないんだろう?」

<frameworkAssembly assemblyName="System.Windows.Interactivity" targetFramework=".NETFramework4.5" />

自家製Packageでちゃんと参照追加されてますよ・・・

2017/02/10 追記

VS2013でビルドした中間ファイルやローカルの設定ファイルが残っているプロジェクトをVS2015にアップデートしたときは、このおまじないは効きませんでした。

実行時は問題ないですが、XAMLエディタで波線が消えません。

このケースの場合は、中間ファイルなどをすべて消してビルドしなおしたら解決しました。