DisplayAlert导致Xamrain应用程序崩溃

时间:2019-06-01 20:51:34

标签: xamarin xamarin.forms

我正在使用显示警报进行简单的是或否对话,但这冻结了我的UI,我也不知道为什么。

private  async void BtnDeleteStockTake_Clicked(object sender, EventArgs e)
{

        var selectedItem = gridItems.SelectedItem as StockTakeTransArgsSage;
        var action =  await DisplayAlert("First 1", "Are you sure you wish to delete Stock Take", "Yes", "No");
        if (action)
        {
            StockTakeTransArgsSage _item = new StockTakeTransArgsSage();
           _item =database.GetSingleStockTake(selectedItem.StockTakeId).Result;
           _item.Quantity = decimal.Parse(txtQty.Text);

            int updated = await database.DeleteStockTake(_item);
            await DisplayAlert("Second 1", "Stock Take Deleted", "OK");          
            await RebindData();
        }
}

奇怪的事情,以及第一个警告的显示警告,都不会消失

这会导致UI崩溃并出现致命错误,但是如果我正常执行代码而没有显示警报,那很好,它确实会显示警报,然后冻结。

我的删除库存功能

public async Task<int> DeleteStockTake(StockTakeTransArgsSage args)
{
   return await database.DeleteAsync(args);


}

“我的单身”功能。

public async Task<StockTakeTransArgsSage> GetSingleStockTake(int ID)
{
        StockTakeTransArgsSage _stocktake = new StockTakeTransArgsSage();          
        _stocktake = await database.Table<StockTakeTransArgsSage>().Where(w => w.StockTakeId == ID).FirstOrDefaultAsync();       
        return _stocktake;

}

3 个答案:

答案 0 :(得分:1)

很有可能是由于您描述的行为(并查看代码),听起来像是因为Display Alert未在UI线程上运行,这导致应用程序等待您关闭此警报框在能够做任何事情之前。因此,您的应用程序不会崩溃或死机,它只是在其他线程上启动警报。 因此,将其更改为以下内容:

Device.BeginInvokeOnMainThread(() =>
{
            DisplayAlert("Second 1", "Stock Take Deleted", "OK");          
});

让我知道这是否合理。

答案 1 :(得分:0)

您是否尝试过等待

StockTakeTransArgsSage _item = new StockTakeTransArgsSage();
           _item = await database.GetSingleStockTake(selectedItem.StockTakeId);
           _item.Quantity = decimal.Parse(txtQty.Text);

如我所见,这将起作用。还要确保在完成该过程之前,您不要触摸屏幕上的任何其他UI组件。

答案 2 :(得分:-1)

在您的代码中,只有那些行会导致该行为:

       StockTakeTransArgsSage _item = new StockTakeTransArgsSage();
       _item =database.GetSingleStockTake(selectedItem.StockTakeId).Result;
       _item.Quantity = decimal.Parse(txtQty.Text);

        int updated = await database.DeleteStockTake(_item);

这些行不能在不冻结一段时间的情况下在UI线程上执行。这可能会导致崩溃,您没有提供任何有关崩溃输出中看到的信息,因此这是唯一可能的解释。