我需要显示一个ViewModel中的MessageDialog,并且我需要将一个Action关联到按下的按钮上。为了这个目的,我写了下面的:等待DisplayActionSheet(...)立即在Windows上返回null
//Dummy implementation
private string Translate(string element) => element;
public async Task ShowAsync(string message, Dictionary<string, Action> commands)
{
var translatedCommands = new Dictionary<string, Action>();
foreach (var element in commands)
translatedCommands.Add(Translate(element.Key), element.Value);
string selectedElement = null;
var buttons = new string[translatedCommands.Keys.Count];
translatedCommands.Keys.CopyTo(buttons, 0);
Task<string> Result = null;
Device.BeginInvokeOnMainThread(() =>
{
Result = App.Current.MainPage.DisplayActionSheet(message, null, null, buttons);
});
selectedElement = await Result;
if (selectedElement == null)
return;
translatedCommands[selectedElement]?.Invoke();
}
然后我把它从RelayCommand
private async void ExecuteButtonCommand(object p)
{
int Selectedindex = 0;
var messageCommands = new Dictionary<string, Action>()
{
{ "Before 2003",() =>
{
Selectedindex = 1;
}
},
{ "After 2003",() =>
{
Selectedindex = 2;
}
},
};
await ShowAsync("Select period", messageCommands);
var dummy = Selectedindex;
}
工作得非常好于Android,而是立即在Windows DisplayActionSheet
返回null。我见过this so question,但它不适用于我,因为如果我在Device.BeginInvokeOnMainThread
之内等待ShowAsync不会变得等待。
不是!它没有工作。 Show不会等待消息对话框关闭,并且DisplayActionSheet不会等待。所以我的行动没有执行。 –