繁体   English   中英

Windows 10 UWP StackPanel可见性不起作用

[英]Windows 10 UWP StackPanel Visibility not working

我有一个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调用,并且明显隐藏进度面板,它会在此时显示。 我还尝试在ProcessRequest方法调用内部显示和隐藏面板,在方法的开始显示它,并在最后折叠它。

我验证了长时间运行的方法过程实际上需要3-5秒的时间来执行,因此它并不是将面板隐藏得如此之快以至于您从未见过。

似乎这是一个UI刷新问题,但我不确定如何解决。 似乎是因为调用方法BtnProcess_OnClick正在完成所有操作,因此UI从未真正刷新,直到BtnProcess_OnClick方法完成并返回为止,这就是为什么它从不显示。 那是对的吗? 如果是这种情况,您如何解决?

我不愿意将ProcessRequest方法调用放在Task.Run内,因为该方法确实需要与UI进行大量交互,并且该解决方案会将它放在不同的线程上,这意味着我必须编写大量代码(我认为),然后解决该问题。 似乎必须有一个简单的解决方案,我想念吗?

谢谢!

根据Archana的建议,我对ProcessRequest进行了异步方法调用。 但是,该方法内部没有任何可等待的东西。 因此,仅将方法签名标记为异步,而无需等待即可使它仍然同步运行(据我了解)。 因此,为使其强制异步运行,我在方法内部添加了以下内容并标记为异步:

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更新。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM