在 App.xaml.cs 中调用 UWP MessageDialog 的推荐方法

Recommend way to call UWP MessageDialog in App.xaml.cs

我的 App.xaml.cs 中有一个只有一个按钮的 MessageDialog 我希望从其他页面使用它。 有几种方法似乎可行,但由于异步和 Tasks 有一些微妙之处,它是正确的吗?

以下是用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();
}

这两种方法在功能上是等效的,但首选的解决方案是不要将这些方法放在 App class 中。相反,您应该创建一个单独的 class,它甚至可以是静态的,您可以使用它来访问这些可重用的消息对话框。这样做的原因是关注点分离。 App class 应仅包含与整个应用程序初始化和生命周期相关的代码。这是一个简化对话框显示的辅助方法,因此它应该位于其他地方:

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!");

我认为推荐的方法是创建实现接口的客户端对话框或消息服务:

public interface IDialogService
{
    Task ShowMessageAsync(string message);
}

public class DialogService
{
    public async Task ShowMessageAsync(string message)
    {
        MessageDialog messageDialog = new MessageDialog(message);
        await messageDialog.ShowAsync();
    }
}

然后您可以从您应用中的任何 class 使用此服务,例如:

IDialogService dialogService = new DialogService();
await dialogService.ShowMessageAsync("message...");

如果您在您的应用中采用推荐的 MVVM 模式,您还可以使用接口注入您的视图模型:

public ViewModel(IDialogService dialogService)
{
}

...并在您的单元测试中轻松模拟对话服务,例如:

ViewModel vm = new ViewModel(new MockDialogService());

如果您使用静态 class 或直接从视图模型调用的方法,这是不可能的。