在 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 或直接从视图模型调用的方法,这是不可能的。
我的 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 或直接从视图模型调用的方法,这是不可能的。