Windows 10 UWP StackPanel可见性无效



我有一个Windows 10 UWP应用程序,在我的XAML中,我有一个用于显示进度栏的stackpanel。因此,默认情况下,stackpanel可见性设置为崩溃。然后,在后面的代码中,我试图在用户单击按钮时将可见性设置为可见性,然后我调用一种方法来进行一些处理。在此示例中,面板永远不会显示。

    private void BtnProcess_OnClick(object sender, RoutedEventArgs e)
    {
        //Set the progress panel to visible
        toggleProgressPanel(true);
        //This is a long running process that can take 3-5 seconds.
        ProcessRequest();
        //Hide the progress panel
        toggleProgressPanel(false);
    }
    private void toggleProgressPanel(bool show)
    {
        pnlProgressBar.Visibility = show ? Visibility.Visible : Visibility.Collapsed;
    }

我在测试过程中注意到的一件事是,如果我评论过程重点调用,显然是进度面板的隐藏,它将出现在此时。我还尝试显示和隐藏ProcessRequest方法调用的内部面板,并在方法的一开始显示,并在最后将其崩溃。

我验证了长期运行的方法实际上确实需要3-5秒才能执行,因此并不是因为它将面板隐藏得如此之快,以至于您永远不会看到它。

几乎看来这是一个UI刷新问题,但我不确定如何修复它。似乎是因为调用方法,btnprocess_onclick正在执行所有操作,在btnprocess_onclick方法完成并返回之前,UI永远不会刷新,这就是为什么它永远不会显示的原因。那是对的吗?如果是这种情况,您如何解决这个问题?

我不愿意将processRequest方法调用在任务的内部。lun,因为该方法确实需要与UI进行相当多的互动,并且该解决方案会将其放在另一个线程上,这意味着我必须写作我认为有大量的代码(我认为(进行解决。看来我缺少一个简单的解决方案?

谢谢!

根据Archana的推荐,我对processRequest async进行了方法。但是,我没有该方法中有什么等待的。因此,只要将方法签名标记为无等待的异步,就可以同步运行(据我了解(。因此,为了强迫它运行异步,我在方法内部添加了以下内容,并标记了异步:

await Task.Delay(50);

这只是一个很小的延迟,几乎不引人注目,但也给了我在方法中所期待的东西。

然后,我还更改了此方法的呼叫者,在我的情况下,按钮按事件并将其变为异步,并等待了对该方法的调用。

现在,它可以按预期工作,我的UI每次都会更新。这是完整的代码:

private async void BtnProcess_OnClick(object sender, RoutedEventArgs e)
{
    //Set the progress panel to visible
    toggleProgressPanel(true);
    //This is a long running process that can take 3-5 seconds.
    await ProcessRequest();
    //Hide the progress panel
    toggleProgressPanel(false);
}
private void toggleProgressPanel(bool show)
{
    pnlProgressBar.Visibility = show ? Visibility.Visible : Visibility.Collapsed;
}
private async Task ProcessRequest()
{
    await Task.Delay(50);
    //Now do all of my long running code here
}

执行所有这些操作允许控件返回我长期运行方法的呼叫者,在我的情况下,按钮按事件,而长期运行的processRequest方法会使工作不断工作。通过将控件返回到呼叫者,它可以完成并允许UI更新。

希望这会有所帮助!

最新更新