/// <summary> /// Switches to a Page which is to send back a result of type TResult /// </summary> public async Task <TResult> PromptAsync <TResult>(IResultPage <TResult> page) { // wrap new page in NavigationPage so it appears like pages launched from ShowAsync var wrappedPage = new NavigationPage((Page)page); await _navigation.PushModalAsync(wrappedPage, true); return(await page.GetResultAsync()); }
/// <summary> /// Switches back to Page which called PromptAsync() and sends back the result /// </summary> public void Return <TResult>(TResult value, IResultPage <TResult> sender) { if (sender.Awaiter.Task.IsCompleted || sender.Awaiter.Task.IsCanceled || sender.Awaiter.Task.IsFaulted) { return; // already called Return, perhaps error or user double clicked before visually returned back to previous page } if (!(sender is Page)) { throw new InvalidOperationException($"Storyboard.Return cannot be called with sender not being a page. Was {sender.GetType().Name}"); } sender.Awaiter.SetResult(value); // go back in navigation stack _navigation.PopModalAsync(); }
/// <summary> /// Uses the IResultPage's Awaiter property to allow us to <code>await</code> from the result. /// </summary> public static async Task <TResult> GetResultAsync <TResult>(this IResultPage <TResult> page) { return(await page.Awaiter.Task); }
public void RegisterCancelATest(IResultPage resultPage) { resultPage.CancelTest += new CustomEventArgs.EventHandlerDefinitions.CancelTestEventHandler(CancelTest); }