使用 WPF Task Dialog Wrapper 实现“请勿再次显示此消息”





0/5 (0投票)
如何使用 WPF 任务对话框包装器实现“请勿再次显示此消息”
多年来,Windows应用程序的一个常见功能是可以在对话框中出现的有用的“不要再显示此消息”风格的复选框。 任务对话框API也直接支持此功能,因此,我的WPF任务对话框包装器也将其公开。今天,我将向您展示如何在现实场景中轻松利用它。有关包装器本身的更多信息,请参阅我在CodeProject上的文章。
对话框本身仅用于显示复选框和文本,以及在对话框返回后向您报告其选中/未选中状态(或者,可选地,使用TaskDialogCallback
,我将在以后尝试介绍)。实际实现功能,即确保您的对话框不再显示,取决于您。幸运的是,这很简单,我将向您展示。
我将以我开发的名为ItsBeen的小应用程序为例进行演示。这是一个我开发的简单小项目,您可以在GitHub上找到并下载代码这里(点击顶部附近的“Download as zip”按钮)。开箱即用,它仅使用任务对话框显示严重异常(请查看App.xaml.cs底部附近的代码)。还有一个地方它也使用任务对话框显示删除确认,但我们为什么不更新它以支持以后不再显示确认呢?
首先,我们需要一种方法来存储此设置。由于这是用户特定的偏好,因此需要将其存储在主应用程序文件之外。此外,它需要在应用程序运行之间持久存在,这意味着它需要某种更持久的存储,例如文件、数据库或其他。
我喜欢为此使用方便的.settings文件,通常命名为“User.settings”。在这里,我将放置所有用户范围的设置。这些设置的好处是它们存储在用户特定的文件夹中(当前用户在AppData/LocalSettings下),并且在一个单独生成的、保存和读取的文件中。这满足了我们之前确定的两个标准(但请参阅下面的“额外积分”部分)。
在ItsBeen.App
项目中创建设置文件。添加一个名为ShowConfirmItemDelete
、类型为bool
的设置,并确保其范围是User
。将其值设置为true
。这样,您很快就会看到,即使是第一次,确认对话框也会始终显示。
现在我们有了持久化的设置,我们将继续修改确认对话框。如果您正在跟随我的项目,请打开EditItemViewModel.cs并向下滚动几百行。您应该会看到这段代码
现在我们有了持久化的设置,我们将继续修改确认对话框。如果您正在跟随我的项目,请打开EditItemViewModel.cs并向下滚动几百行。您应该会看到这段代码
TaskDialogOptions options = TaskDialogOptions.Default;
options.Title = Properties.Resources.ConfirmItemDeleteCaption;
options.MainInstruction = String.Format(Properties.Resources.ConfirmItemDeleteContent, _item.Name);
options.CommonButtons = TaskDialogCommonButtons.YesNo;
_taskDialogService.ShowTaskDialog(this, options, tdResult =>
{
if (tdResult.Result == TaskDialogSimpleResult.Ok ||
tdResult.Result == TaskDialogSimpleResult.Yes)
{
DeleteItem();
}
});
这设置了一个简单的任务对话框,带有基本的删除确认消息。我还注意到它使用了之前介绍过的TaskDialogService
。因此,它定义了一个简单的回调函数来检查确认,如果给出,则删除项目。(此回调是服务的一个功能,不应与前面提到的TaskDialogCallback
功能混淆。)
让我们修改它来定义验证文本,设置该文本后还将显示checkbox
。然后,我们将将其选中状态的值存储在前面定义的用户的设置中。我们还将稍微调整一下逻辑,以便在需要时完全跳过确认步骤。总而言之,代码现在看起来像这样
if (Properties.User.Default.ShowConfirmItemDelete)
{
TaskDialogOptions options = TaskDialogOptions.Default;
options.Title = Properties.Resources.ConfirmItemDeleteCaption;
options.MainInstruction = String.Format(Properties.Resources.ConfirmItemDeleteContent, _item.Name);
options.CommonButtons = TaskDialogCommonButtons.YesNo;
options.VerificationText = "Don't show this message again";
_taskDialogService.ShowTaskDialog(this, options, tdResult =>
{
if (tdResult.VerificationChecked.HasValue)
Properties.User.Default.ShowConfirmItemDelete = !tdResult.VerificationChecked.Value;
if (tdResult.Result == TaskDialogSimpleResult.Ok ||
tdResult.Result == TaskDialogSimpleResult.Yes)
{
DeleteItem();
}
});
}
else
{
DeleteItem();
}
我已经将对话框逻辑包装在对我们创建的“显示确认”用户设置的条件检查中。如果关闭它,那么我们立即删除,而不是先询问。
还要注意的是,我在检查确认结果并删除之前,根据复选框的选中状态设置了我们用户设置的值。这样,即使他们选择了“否”或点击了取消按钮(X),我们仍然会捕获他们显示/不显示的偏好。我还进行了一个快速的null
检查,以确保安全,因为VerificationChecked
属性是可空的bool
。
就是这样!如果您进行测试,您会发现,如果已选中,我们确实不再询问确认删除。
有用的链接
- 微软提供了一些关于“不要再显示此<item>”的非常好的建议。
- 这是微软关于此的另一段内容,更具体地是从设计概念的角度。
额外积分:有些人可能会注意到,重新运行应用程序时设置会丢失!嘿,这不就是使用设置文件的目的吗?嗯,原来还有更多工作要做。您的应用程序需要记住调用Properties.User.Default.Save()
,否则修改后的值将不会写入磁盘。至于如何(以及何时)做到这一点,我留给您。我个人喜欢将其放在应用程序关闭事件中,作为在应用程序退出前保存设置的快速方法。
旁注:对于那些跟随我的ItsBeen项目代码的人来说,您可能已经注意到,将用户设置文件添加到ItsBeen.App
项目会导致ItsBeen.App.Phone
项目构建失败。我的ItsBeen
应用程序演示了在两种不同的视图系统(WPF和WP7)之间共享模型和ViewModel代码。App.Phone
项目是针对WP7二进制文件和框架构建的,但使用相同的cs文件。不幸的是,WP7不支持.settings文件!糟糕!您可以插入以下代码来使其正常工作。但不要忘记我上面的“额外积分”注意事项:在这里它仍然适用!
using System;
using System.IO.IsolatedStorage;
namespace ItsBeen.App.Properties
{
internal sealed class User
{
private static User defaultInstance = new User();
public static User Default
{
get { return defaultInstance; }
}
public User()
{
SetDefaults();
}
public bool ShowConfirmItemDelete
{
get
{
return ((bool)(IsolatedStorageSettings.ApplicationSettings["ShowConfirmItemDelete"]));
}
set
{
IsolatedStorageSettings.ApplicationSettings["ShowConfirmItemDelete"] = value;
}
}
private void SetDefaults()
{
ShowConfirmItemDelete = true;
}
}
}