windows 在ContentDialog打开时执行工作

ux6nzvsh  于 2023-03-13  发布在  Windows
关注(0)|答案(2)|浏览(146)

我正在使用UWP框架为Windows 10移动的企业版制作一个应用。我有许多文件要在循环中保存到磁盘,我希望在保存文件时显示一个弹出窗口ProgressBar,阻止用户。我希望在每次循环迭代时更新ProgressBar,并在最后将其删除。
我想我可以创建一个包含ProgressBar的自定义ContentDialog,并在开始时显示ContentDialog,但我不知道如何做到这一点,因为ContentDialogShowAsync()方法在对话框打开时会阻塞。
我的猜测是我必须在一个新的线程/任务/任何东西中执行ShowAsync()或文件循环。对于这一点有什么最佳实践方法吗?
注意-根据要求,进度条不能进入当前页面。它必须是某种弹出窗口,阻止用户进入,直到被代码关闭。

ddrv8njm

ddrv8njm1#

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

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

eit6fx6z2#

一个迟到的回复,但如果有人在未来遇到这种情况,另一个可能的解决方案是用进度条阻塞页面的其余部分。如果视图的内容包含在一个网格中,您可以将进度栏作为网格中的最后一个元素,这会使它显示在所有其他UI元素的顶部。您可能必须用它 Package 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>

相关问题