【问题标题】:Doing work while a ContentDialog is open在 ContentDialog 打开时工作
【发布时间】:2018-03-27 04:41:35
【问题描述】:

我正在使用 UWP 框架为 Windows 10 移动企业版制作应用程序。我有许多文件要循环保存到磁盘,我想显示一个弹出窗口ProgressBar,在保存文件时阻止用户。我想在每次循环迭代时更新ProgressBar,并在最后删除它。

我想我可以制作一个包含ProgressBar 的自定义ContentDialog,并在开头显示ContentDialog。我很困惑如何做到这一点,因为ContentDialogShowAsync() 方法在对话框打开时会阻塞。

我的猜测是我必须要么在新线程/任务/任何东西中执行ShowAsync() 或文件循环。有没有一种最佳实践方法?

注意——进度条不能,按要求就在当前页面里面。它必须是某种阻止用户的弹出窗口,直到它被代码关闭。

【问题讨论】:

    标签: c# windows uwp


    【解决方案1】:

    ContentDialog 实际上并不适合这种场景。问题是ContentDialog 代表一个模态对话框,这意味着应用程序窗口被阻塞,直到用户关闭对话框。 Task ShowAsync() 方法的构建方式是,您可以等待用户执行内容对话框操作,并且您无法在 UI 之外的任何其他线程上打开对话框。

    您有三种可能的解决方案:

    • 在您的应用程序中添加一种“状态栏”,这将指示操作正在进行中,当用户单击它时,会显示带有进度详细信息的Popup(可以通过单击其他地方将其关闭,但用户能够从“状态栏”再次显示)
    • 实现一个辅助视图,它将显示操作的进度。您可以在documentation 中找到有关辅助视图的更多信息。另请注意,辅助视图具有不同的 UI 线程,因此在更新其 UI 时必须牢记这一点(您必须使用该视图的 Dispatcher
    • 在您的应用程序中创建一些“假窗口”,它只是一个高于所有其他 UI 的 UI 元素。然而,这感觉不对,所以我建议反对这种方法。

    【讨论】:

    • 我一直在试验选项 #2,它似乎工作得非常好!但是我还有一个问题 - 有没有办法让新窗口出现在旧窗口之上,这样你就可以看到新窗口后面的旧窗口?目前我的新页面占据了整个屏幕,即使我将其设置为具有较小的宽度/高度和透明背景。
    • ShowAsync 没有阻塞。只是不要使用await,然后在对话框打开时运行尽可能多的代码。然而问题是用户可以使用返回按钮或退出键退出对话框。为什么不只显示进度条并禁用/隐藏页面上的所有控件?
    • @PeterTorr-MSFT 我并不是说ShowAsync 确实是在阻止,而是在对话框打开时阻止用户在页面上输入。据我了解,OP 希望能够在对话框中显示进度,同时仍然能够正常与应用程序交互,而据我所知,ContentDialog 是不可能的。
    • 不,您不能禁用它。最好只禁用控件并选择显示您自己的简单假对话框。
    • 好的,我现在已经整理好了。我已经使用了一个通常隐藏的控件,它的 ZIndex 高于其他所有控件,当我想显示进度时,我会显示它并禁用整个页面。感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2018-11-06
    相关资源
    最近更新 更多