You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在IF结构中正确处理Xamarin DisplayAlert?

解决DisplayAlert返回Task而非预期布尔值的问题

嘿,这个问题我太熟悉了!你碰到的是异步方法的典型小坑——DisplayAlert其实是个异步方法,它返回的不是直接的"YES"/"NO"字符串或者布尔值,而是一个Task<bool>对象,所以你直接调用ToString()才会得到类似System.Threading.Tasks.Task1[System.Boolean]`的奇怪字符串。

下面给你两种靠谱的解决方式:

1. 用await获取异步结果(推荐)

这是最简洁规范的做法,前提是你的方法要标记为async:

// 确保方法是async修饰的,比如async void或者async Task
async void DeleteItem()
{
    // 用await等待异步操作完成,直接拿到布尔值
    bool choice = await DisplayAlert("Title", "Delete This?", "YES", "NO");
    
    if (choice)
    {
        // 用户点击了YES,执行删除逻辑
        // do something
    }
    else
    {
        // 用户点击了NO,做其他处理或者啥也不做
    }
}

这里要注意:DisplayAlert的返回值是bool——点击"YES"返回true,点击"NO"返回false,完全不用转字符串,直接判断布尔值就好。

2. 用ContinueWith处理异步回调(适合无法用await的场景)

如果你的代码处在不能用await的同步环境里,可以用ContinueWith来监听异步操作完成的事件:

DisplayAlert("Title", "Delete This?", "YES", "NO")
    .ContinueWith(task => 
    {
        // task.Result就是异步操作返回的布尔值
        if (task.Result)
        {
            // 点击YES的处理逻辑
            // do something
        }
        else
        {
            // 点击NO的处理逻辑
        }
    }, TaskScheduler.FromCurrentSynchronizationContext());

加上TaskScheduler.FromCurrentSynchronizationContext()是为了确保回调代码在UI线程执行,毕竟涉及UI操作的话,必须在UI线程处理才不会出错。

总结一下:别再试图把Task对象转成字符串啦,异步方法就要用异步的方式去获取结果,await是首选,简单又直观!

内容的提问来源于stack exchange,提问作者giacom0c

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:00:55