我正在尝试使用 PopUpService 来显示 Popup,一方面它接受一个参数并返回一个参数。
不幸的是,返回后弹出窗口似乎没有完成异步任务,我不知道为什么。我认为需要某种 CancellationToken。
这里是必要的代码: 在一个 ViewModel 中,PopUp 被称为:
public partial class SomeViewModel
{
private readonly IPopupService _popupService;
// ...
public SomeViewModel(
IPopupService popupService)
{
_popupService = popupService;
}
[RelayCommand]
private async Task OnCallingPopUpAsync()
{
var result = await _popupService.ShowPopupAsync<PopupViewModel>(
onPresenting: viewModel => viewModel.TransferValue(true)
);
if (result is bool boolResult)
Debug.WriteLine("Success!!");
else
return;
}
}
在 PopupViewModel 中接收值。此外,在 View 中可以通过按下按钮并调用 ClosePopupCommand 来关闭 PopupView:
public partial class PopupViewModel : Popup
{
public ImagePickerViewModel() {}
[RelayCommand]
private async Task OnClosePopup()
{
await CloseAsync(true);
}
public void TransferValue(bool value)
{
Debug.WriteLine($"The transferred value is {value}");
}
}
尽管如此,弹出窗口并未关闭。
我尝试传递 CancellationToken (类似于在 MS Docs 中执行的方式,如下所示:
[RelayCommand]
private async Task OnClosePopup()
{
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
await CloseAsync(true, token: cts.Token);
}
然而,这产生了一个异常:
System.Threading.Tasks.TaskCanceledException: 'A task was canceled.'
我该如何解决这个问题?
dotnet 和 MAUI 版本是什么?您正在测试 iOS 或 Android 的平台?