Dialogs
This set of libraries is meant to provide easy management of dialogs from ViewModels in your Xamarin apps. It provides means of invoking dialogs, awaiting their results and streamlinining dialog creation in respective platform specific projects.
Question
The dialogs here are not stock message dialogs provided by the platforms. The dialogs here are modal windows with completly custom UI required for more specific scenarios.
Hint
In the essence the mechanism here is very simillar to AoLibs' naviagtion solution.
I tried to find the best balance between passing instances as object arguments and using generics in order not to make the code overly complex.
Setup
The dialog consists of its ViewModel paired with implementation of ICustomDialog interface in platform projects. All registered dialogs are handled by ICustomDialogsManager which can be injected into your page ViewModels. ICustomDialog defines methods to manipulate the dialog.
Additional caveats will be described in subpages for each platfrom.
Quick Start
Steps:
- Define an enum which will contain identifiers for all your dialogs,
DialogIndexfor example. - Create dialog's ViewModel inheriting
CustomDialogViewModelBasein your shared project. - Create implementation of
ICustomDialogin your platform specific project by inheritingCustomDialogBase. - During app startup create instance of
CustomDialogsManagerBasepassing dictionary matching dialog identifiers with providers of your's dialog definition. - Inject
ICustomDialogsManagerto your page ViewModel and access the dialog.
Dialog
Dialog is defined by ICustomDialog interface and is implemented separately on each platorm. Aside from basic funtions like Show&Hide it allows to await result:
Task<TResult> AwaitResult<TResult>(CancellationToken token = default);
The dialog also has its parameter to give a context for its invocation, you can pass it to Show() method. You can pass anything there as it's an argument of object type.
ViewModel
The ViewModel for our dialog must inherit from CustomDialogViewModelBase which provides callbacks for dialog's lifetime as well as utility methods to access the dialog itself and manage the possibly awaited result of dialog's execution. Additionally from ViewModel you can define simple dialog config shared by both platforms.
Features
-
Dialog config
You can override
CustomDialogConfigproperty in order to provide custom config defining basic characteristics of a dialog such as:Gravity- defining side of screen where dialog should be shown.IsCancellable- can dialog be cancelled by tapping outside or using back button.StretchHorizontally- whether to stretch container horizontallyStretchVertically- whether to stretch container vertically
-
Access to dialog instance
You can access the dialog itself with additional methods to manipulate the dialog's result.
-
Lifecycle callbacks
You can override methods that indicate that dialog has been shown or hidden.
Flavours
With CustomDialogViewModelBase being the very base dialog ViewModel there are others that provide additional functionality.
CustomDialogViewModelWithParameterBaseallows to define generic parameter of the argument that will be passed when showing the dialog. Additional method to override is providedOnDialogAppearedwhich will pass given type instead of anobject