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 方法完成和 returns 才真正刷新,这就是它从未显示的原因.那是对的吗?如果是这种情况,您如何解决这个问题?
我不愿意将 ProcessRequest 方法调用放在 Task.Run 中,因为该方法确实需要与 UI 进行大量交互,并且该解决方案会将其放在不同的thread 这意味着我必须编写大量代码(我认为)才能解决这个问题。看来一定有一个简单的解决方案我错过了?
谢谢!
根据 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
}
完成所有这些允许控制权 return 回到我的 long 运行ning 方法的调用者,在我的例子中是按钮按下事件,而 long 运行ning 方法ProcessRequest 保持异步工作。通过 return 将控制权返回给调用者,它可以完成并允许 UI 更新。
希望对您有所帮助!
我有一个 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 方法完成和 returns 才真正刷新,这就是它从未显示的原因.那是对的吗?如果是这种情况,您如何解决这个问题?
我不愿意将 ProcessRequest 方法调用放在 Task.Run 中,因为该方法确实需要与 UI 进行大量交互,并且该解决方案会将其放在不同的thread 这意味着我必须编写大量代码(我认为)才能解决这个问题。看来一定有一个简单的解决方案我错过了?
谢谢!
根据 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
}
完成所有这些允许控制权 return 回到我的 long 运行ning 方法的调用者,在我的例子中是按钮按下事件,而 long 运行ning 方法ProcessRequest 保持异步工作。通过 return 将控制权返回给调用者,它可以完成并允许 UI 更新。
希望对您有所帮助!