我如何使用Xamarin.Forms等待模态形式解雇?

Jam*_*een 17 xamarin xamarin.forms

使用Xamarin.Forms如何使用make async方法等待表单解散?如果我使用

await Navigation.PushModalAsync(page);
Run Code Online (Sandbox Code Playgroud)

一旦动画结束,它将返回,而不是在页面被解除时.

我想要创建模态Task SignInAsync方法,如果登录成功则返回true.

Ste*_*oix 22

您可以通过在登录页面中触发事件并在继续之前侦听该事件来完成此操作,但是您希望获得完整的TAP支持并且我在那里支持您.这是一个简单但工作正常的2页应用程序.您显然希望使用ContentPage自定义子类并使用正确的方法而不是我的快速方法Command,但是您明白了,它可以节省我的输入.

public static Page GetFormsApp ()
{
    NavigationPage navpage = null;
    return navpage = new NavigationPage (new ContentPage { 
        Content = new Button {
            Text = "Show Login dialog",
            Command = new Command (async o => {
                Debug.WriteLine ("Showing sign in dialog");
                var result = await SignInAsync (navpage);
                Debug.WriteLine (result);
            })
        }
    });
}

static Task<bool> SignInAsync (NavigationPage navpage)
{
    Random rnd = new Random ();
    var tcs = new TaskCompletionSource<bool> ();
    navpage.Navigation.PushModalAsync (new ContentPage {
        Content = new Button {
            Text = "Try login",
            Command = new Command ( o => {
                var result = rnd.Next (2) == 1;
                navpage.Navigation.PopModalAsync ();
                tcs.SetResult (result);
            })
        }
    });
    return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

小缺点是Task<bool>pop模式动画结束前的返回,但是:

  1. 容易修复
  2. 如果您正在等待推动新模态的结果,那么这只是个问题Page.否则,呃,继续吧.


noe*_*cus 15

覆盖OnAppearing

首先,值得注意的是,OnAppearing在许多情况下,简单地覆盖调用页面就足够了.

protected override void OnAppearing()
{
    base.OnAppearing();
    ...
    // Handle any change here from returning from a Pushed Page
}
Run Code Online (Sandbox Code Playgroud)

(请注意,在调用者之后调用推送页面的OnDisappearing覆盖- 对我来说似乎有点倒退!)OnAppearing


AwaitableContentPage

其次......这是我对@Chad Bonthuys的回答:

public class AwaitableContentPage : ContentPage
{
    // Use this to wait on the page to be finished with/closed/dismissed
    public Task PageClosedTask { get { return tcs.Task; } }

    private TaskCompletionSource<bool> tcs { get; set; }

    public AwaitableContentPage()
    {
        tcs = new System.Threading.Tasks.TaskCompletionSource<bool>();
    }       

    // Either override OnDisappearing 
    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        tcs.SetResult(true);
    }

    // Or provide your own PopAsync function so that when you decide to leave the page explicitly the TaskCompletion is triggered
    public async Task PopAwaitableAsync()
    {
        await Navigation.PopAsync();
        tcs.SetResult(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后调用它:

SettingsPage sp = new SettingsPage();
await Navigation.PushAsync(sp);
await sp.PageClosedTask; // Wait here until the SettingsPage is dismissed
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。谢谢 AwaitableContentPage 的想法。它工作正常,也可以与使用 XAML 的“子”一起使用。谢谢! (2认同)