在 ContentDialog 打开时工作

问题描述 投票:0回答:2

我正在使用 UWP 框架为 Windows 10 Mobile Enterprise 制作应用程序。我有许多文件要循环保存到磁盘,我想显示一个弹出窗口

ProgressBar
在保存文件时阻止用户。我想在每次循环迭代时更新
ProgressBar
,并在最后删除它。

我想我可以制作一个包含

ContentDialog
的自定义
ProgressBar
,并在开始时显示
ContentDialog
。我很困惑如何做到这一点,因为
ContentDialog
ShowAsync()
方法在对话框打开时阻塞。

我的猜测是我必须在新的线程/任务/任何东西中执行

ShowAsync()
或文件循环。是否有最佳实践方法?

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

c# windows uwp
2个回答
1
投票

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

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

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

0
投票

回复晚了,但如果将来有人遇到这个问题,另一种可能的解决方案是用进度条阻止页面的其余部分。如果您的视图内容包含在单个网格中,您可以将进度条作为网格中的最后一个元素放置,从而使其显示在所有其他 UI 元素之上。您可能必须用它自己的 Grid 包裹 ProgressBar,以便您可以将 ProgressBar 放在页面的中心,但在 ProgressBar 运行时使用网格覆盖并有效地禁用页面的其余部分。

我在我的应用程序中对加载环做了类似的事情:

<Grid
    Grid.ColumnSpan="3"
    Background="Black"
    Visibility="{x:Bind ViewModel.IsLoading, Converter={StaticResource VisibleWhenTrueConverter}}"
    Opacity="0.6">
    <ProgressRing
        Width="100"
        Height="100"
        IsActive="{x:Bind ViewModel.IsLoading}" />
</Grid>
© www.soinside.com 2019 - 2024. All rights reserved.