Xamarin.forms Xamarin表单-无法让此DisplayAlert正常工作

Xamarin.forms Xamarin表单-无法让此DisplayAlert正常工作,xamarin.forms,Xamarin.forms,我已经做了很多拖网调查,找到了一些我需要的信息,但仍然没有完全弄清楚如何将所有的片段组合在一起。我要么得到1。阻止生成的错误,2。没有消息出现,或3。消息出现,但同时程序仍在继续 因此,我想问用户一个问题,这个问题与重新加载上一个会话(或重新启动)中的信息有关。它应该等待这个答案。我知道我需要async/await,我还需要答案(作为布尔值或字符串)。我还发现我需要Device.BeginInvokeOnMainThread和/或OnAppearing,以便消息真正出现在第一位。我看到的大多数示

我已经做了很多拖网调查,找到了一些我需要的信息,但仍然没有完全弄清楚如何将所有的片段组合在一起。我要么得到1。阻止生成的错误,2。没有消息出现,或3。消息出现,但同时程序仍在继续

因此,我想问用户一个问题,这个问题与重新加载上一个会话(或重新启动)中的信息有关。它应该等待这个答案。我知道我需要async/await,我还需要答案(作为布尔值或字符串)。我还发现我需要Device.BeginInvokeOnMainThread和/或OnAppearing,以便消息真正出现在第一位。我看到的大多数示例都是将其与按钮单击或其他事件联系在一起,但我希望它在开始时运行,并且在得到答案之前不要执行任何其他操作(因为第一个屏幕上的信息加载取决于答案)

那么,对于DisplayAlert(“Resume?”,“您想重新加载上次会话中的数据吗?”,“yes”,“no”),我如何包装它,使其在启动时出现,并且在应答之前不会发生任何事情(以便我重新加载或重新初始化),并且我可以从其他地方访问该应答(即,将结果粘贴到某种类型的变量中,以便代码的其余部分访问)?这是我第一次使用DisplayAlert,第一次使用async/Wait,第一次使用Device.BeginInvoke…-我一直在修补不同的变体,但一直得到上述三种结果之一:-(

我使用nuget包。有了它,您可以从mvvm代码中调用对话框。您可以

var needToResume = await UserDialogs.Instance.ConfirmAsync(
   message: "Do you want to reload your data from last session?",
   title: "Resume?",
   okText: "yes",
   cancelText: "no",
   cancelToken: cancelationTokenSource.Token);
来自异步方法。或

var needToResume = UserDialogs.Instance.ConfirmAsync(
   message: "Do you want to reload your data from last session?",
   title: "Resume?",
   okText: "yes",
   cancelText: "no",
   cancelToken: cancelationTokenSource.Token).Result;
从常规方法和放置代码,在对话框调用后立即导航/执行其他操作。 您还可以使用回调:

UserDialogs.Instance.Confirm(new ConfirmConfig
   {
      AndroidStyleId = null,
      Title = "Resume?",
      Message = "Do you want to reload your data from last session?",
      OkText = "yes",
      CancelText = "no",
      OnAction = DoThings
   });

private void DoThings(bool needToResume)
{
    //do things
}

您可以使用页面的
on appearing
方法中的
DisplayAlert

protected async override void OnAppearing()
    {
        var answer = await DisplayAlert("Title", "Message", "Positive Button - Yes", "Nagative Button - No");
        if (answer)
        {
            //Do your code here.
        }
    }

希望这对你有用。

我最近收到一个通知,说我因为这个问题获得了“热门问题”奖。当我回来看它时,我发现我从未发布过我的工作解决方案-非常抱歉!我现在要修复它(拖出2年前的代码…)

这个帖子中的其他一些人给了我一些谜题(谢谢Sten Petrov和Chandresh Khambhayata——出于某种原因不让我标记),但缺少的一个(我在其他地方找到的,甚至不记得现在在哪里,但可能是forums.xamarin.com)是我需要base.OnAppearing()在那里。这是完整的相关代码块

protected async override void OnAppearing() {
    var Response=await DisplayAlert("Resume?", "Do you want to resume from where you left off?", "Resume", "Start fresh");
    base.OnAppearing();
    string Resuming=Response.ToString();
    if (Resuming=="True") { //your Resuming and other remaining code here

谢谢,但是不,VS对这段代码不满意。switch需要一个bool,但是当我将var更改为bool时,它会说DisplayAlert返回一个任务-不知道如何处理它。如果没有异步,也不能在某处使用Wait。记住我以前没有使用DisplayAlert或Wait/async,所以您需要明确说明我需要将哪些代码放在哪里。Th这里的代码甚至无法编译(唉,我希望它能这么简单)。:-(我已经编辑了我的答案。希望这对你有用。我最近发现我忘记发布我的解决方案了!现在修复了。感谢你的帮助(我没有让我在答案中标记你)它只在一页上起作用,你必须使用
wait
我想我已经找到了它不起作用的原因。阅读Charles Petzold的书中的字里行间,你不能在主页上这样做。。。。“然而,应用程序中的所有其他页面本质上与起始页面不同,因为它们分为两类:模式页面和非模式页面。在用户界面设计中,“模式”指的是需要用户交互才能继续应用程序。”“。我想我需要做的是写一个菜单作为主页,用户可以选择继续使用以前的信息,或者从那里重新开始。我很高兴知道有人在读这本书。难怪事情不起作用:)这里有一个更好的阅读,这里有一个来自Xamarin Samples github的完整示例项目:谢谢Sten,但已经看到了该页面,它并没有真正帮助我使其工作。它告诉你如何使用DisplayAlert,但不是你需要围绕它编写什么其他代码才能让它按我想要的方式工作(也就是说,在您得到响应之前不要调用构造函数-但是我相信我现在知道我需要从其他人那里获得什么,才能让它以我想要的方式工作)。稍后将查看这些示例。:-)这个软件包不是为我安装的-已经尝试了两次,两次都挂起了VS,我不得不在任务管理器中杀死它。如果我能安装它,我会让你知道我如何使用它。对我来说非常适合。你使用什么VS?试着更新Nuget VS扩展。可能再等一点。2次重新启动后,我就可以开始了,不管它怎么说当前上下文中不存在名称“cancelationTokenSource”。我有“使用acr.userdialogs”,所以我不确定还需要什么。您正处于并行世界惊人冒险的开始。请阅读取消主题。谢谢,但在阅读该页面并点击其他页面之后,除了修复您的打字错误(它是“CancellationTokenSource”,而不是“CancellationTokenSource”)我仍然得到相同的错误,看不出需要什么来修复它。