kamulog

xamarin.formsのネタなど

Xamarin.Forms で AiForms.Dialogs という、いろいろなカスタムダイアログを表示できるプラグインを公開しました。

Xamarin.Forms でのダイアログといえば、ACR User Dialogs が有名で、私も業務で利用していました。個人開発ではこれではなく、DependencyService を利用したプラットフォーム実装でローディング表示などを行なっていたのですが、Android では ProgressDialog を使っており、これが非推奨になってたので作り直そうかと思って修正作業をしてるうちに、あれ、これもうちょいがんばればライブラリとして分離できるのでは?という気持ちになり、結果としてちょいでは全然なかったんですが、ある程度出来上がったので Nuget パッケージ化しました。

最初は自前実装捨てて、ACR User Dialogs に差し替えようと思ったんですが、GitHub リポジトリの活動があまり活発でないのと、ローディングアイコンの差し替えなどのカスタマイズ性がないので自分で作るしかないか、となった次第です。

実装途中で、タイムライン上で紹介されていた Popup Page Plugin の存在に気づき、これで良いのでは?と思いましたが折角作りかけてたので、こちらとは多少差別化しつつ進めました。

リポジトリ

ソース

github.com

Nuget

www.nuget.org

プレリリース版です。

デモ

youtu.be

https://raw.githubusercontent.com/muak/AiForms.Dialogs/master/images/dialog.png

https://raw.githubusercontent.com/muak/AiForms.Dialogs/master/images/toast.png

https://raw.githubusercontent.com/muak/AiForms.Dialogs/master/images/loading.png

開発の経緯

経緯の一つとしては上で挙げたものなんですが、それの他に以下のような経緯がありました。 Xamarin.Forms 標準の DisplayAleartDisplayActionSheet を使えば簡単にダイアログは表示できるんですが、その外観はコントロールしようがなく、特に Android の ActionSheet は特に貧弱な感じを受けていました。 また Forms 側のコードだけで自前でダイアログを作ろうとすると、ダイアログ用の ContentView だけでは完結せず、配置のために外側のレイアウトを AbsoluteLayout 等にしないといけなかったり、ページ側で表示の切り替えなどを制御する必要があったりで、部品として切り離しにくいものがありました。 そういうわけで部品としてちゃんと独立したものが欲しかったのです。

概要

AiForms.Dialogs は、XAML または c# コードで定義した ContentView を各プラットフォームのダイアログの中に設置して表示するものです。

またダイアログの表示位置は、固定ではなく、VerticalLayoutAlignment と HorizontalLayoutAlignment と OffsetX・OffsetY を使って画面上の任意の位置を指定することができます。

機能

  • Dialog – 汎用的なダイアログを表示します。
  • Toast – いわゆるトーストを表示します。
  • Loading – ローディング中などに使う全画面のダイアログを表示します。

使用例

詳細は ReadMe を参照してください。

var ret = await Dialog.Instance.ShowAsync<MyDialogView>(new{Title="Hello"});
// キャンセルされた場合はfalse, 完了した場合はtrueを返します。
// 任意で ViewModel を DialogView に渡すことができます。
// ダイアログが閉じられたら、全ての関連リソースは自動的に破棄されます。

Toast.Instance.Show<MyToastView>(new{Title="Hello",Duration=1500});
// 任意で、ViewModel をToastViewに渡すことができます。

await Loading.Instance.StartAsync(async progress =>{
    // 重い処理など
    for (var i = 0; i < 100; i++)
    {
        await Task.Delay(50);
        // IProgress<double>の値を使ってDialogに進捗を送信することができます。
        progress.Report((i + 1) * 0.01d);
    }
});

おわりに

実は去年記事を公開する予定だったのですが、途中で燃え尽きてしまったため下書きの途中で放置してました。 なので最終リリースからは結構時間が経っています。今の所issueに何も報告されていないのでそれなりに動いているのかなと思います笑

少し凝ったダイアログなどをNETStandardプロジェクトで定義して使う場合などに良ければ使っていただけたらと思います。