我的App.xaml.cs中只有一个按钮,我有一个MessageDialog 我希望从其他页面使用它。 有几种方法似乎有效,但由于异步和任务是微妙的,因此特别正确吗?
使用await App.mymessagebox("A message")
调用以下内容:
public static Task async mymessagebox(string the_message)
{
MessageDialog messagedialog=new MessageDialog(the_message);
await messagedialog.ShowAsync();
}
使用App the_app=(App)Application.current;
await the_app.mymessagebox("A message");
调用以下内容:
public async Task mymessagebox(string the_message)
{
MessageDialog messagedialog=new MessageDialog(the_message);
await messagedialog.ShowAsync();
}
答案 0 :(得分:0)
这两种方法在功能上都是等价的,但首选解决方案不是将方法放在App
类中。相反,您应该创建一个单独的类,它可以是静态的,您将用它来访问这些可重用的消息对话框。其原因在于关注点的分离。 App
类应该只包含与整个应用初始化和生命周期相关的代码。这是一个简化对话框显示的辅助方法,因此它应该驻留在其他地方:
public static DialogHelpers
{
public static async Task ShowMessageAsync(string message)
{
MessageDialog messageDialog = new MessageDialog(message);
await messageDialog.ShowAsync();
}
}
要遵守惯例,您应该在方法名称中添加Async
后缀,以明确方法为async
,并且应为awaited
。
现在调用此帮助程序方法如下所示:
await DialogHelpers.ShowMessageAsync("Hello, world!");
答案 1 :(得分:0)
我认为推荐的方法是创建一个实现接口的客户端对话框或消息服务:
public interface IDialogService
{
Task ShowMessageAsync(string message);
}
public class DialogService
{
public async Task ShowMessageAsync(string message)
{
MessageDialog messageDialog = new MessageDialog(message);
await messageDialog.ShowAsync();
}
}
然后,您可以在应用中的任何课程中使用此服务,例如:
IDialogService dialogService = new DialogService();
await dialogService.ShowMessageAsync("message...");
如果您在应用中采用推荐的MVVM模式,您还可以使用界面注入视图模型:
public ViewModel(IDialogService dialogService)
{
}
...并在单元测试中轻松模拟对话服务,例如:
ViewModel vm = new ViewModel(new MockDialogService());
如果您使用直接从视图模型调用的静态类或方法,则无法执行此操作。