【发布时间】:2016-06-09 19:43:58
【问题描述】:
我需要显示来自 ViewModel 的 MessageDialog,并且我需要将 Action 与按下的按钮相关联。为此,我编写了以下内容:
//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 不会变成可等待的。
【问题讨论】:
标签: c# android xamarin xamarin.android xamarin.forms