Xamarin.Forms.WPFでPrismを使う

現状、PrismはXamarin.Forms.WPFに対応しておらず、エラーが出て使えないのですが、少しソースを修正してやることで、割と簡単に対応させることができたので、その方法を記載します。


対応方法

Prismのリポジトリをクローンして、v7.1.0のタグでチェックアウトします。

修正するファイルは以下の2つです。


Prism.csprojの修正

36行目をコメントアウトします。

  <ItemGroup>

<!--<Compile Condition=" '$(TargetFramework)' == 'net45' " Remove="Navigation/**" />-->
<Compile Update="Properties\Resources.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="Resources.resx" />
<EmbeddedResource Update="Properties\Resources.resx" Generator="ResXFileCodeGenerator" LastGenOutput="Resources.Designer.cs" />
</ItemGroup>


IModuleManager.csの修正

27行目をコメントアウトします。

#if NET45

/// <summary>
/// Raised repeatedly to provide progress as modules are downloaded.
/// </summary>
//event EventHandler<ModuleDownloadProgressChangedEventArgs> ModuleDownloadProgressChanged;
#endif


NuGetパッケージの作成

Prism.DryIoc.FormsやPrism.Unity.Formsプロジェクトで、パックを実行すると、Source/Artifacts/Nugetにパッケージが作成されます。利用時は、通常のパッケージは使わずに、この作成したパッケージを参照するようにします。

今回の修正で変わっているパッケージは、Prism.Coreのみなので、これだけ参照するようにしても大丈夫です。ただし、この場合には、パッケージのバージョンを7.1.1など、現行のバージョンである7.1.0.431より大きくしておかなければいけません。


サンプル

簡単なサンプルを作成しました。

PrismForWPFSample

2019-02-22.png2019-02-22 (1).png

Prismを利用したViewModelのバインドや画面遷移がうまく動いていることが確認できます。もちろんiOSやAndroidでも普通に動きます。

サンプルのNuGetフォルダに修正したPrismのパッケージが含まれているので、それをダウンロードしてそのまま使ってもらっても構いません。


おわりに

完全にテストしたわけではないので、もしかしたら不具合が起きるかもしれませんが、普通に使う分には問題ないんじゃないかと思います。teratailの質問にもあって、気にはなっていたので、今回できることがわかって良かったです。