我需要顯示一個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不會等待。所以我的行動沒有執行。 –