[英]WPF progressbar not showing
我設置了一個WPF ProgressBar
的不確定性為True和隱藏的可見性。 在事件處理程序中,我正在嘗試在更新ObservableCollection
時使ProgressBar可見(以及其ItemsSource為ObservableCollection
的ListView)。 我希望System.Windows.Forms.Application
DoEvents(
)可以使它可見,但事實並非如此。 我注意到SetPBarHelper(() => { ..} )
通常比ListView顯示視覺變化更早完成。
如何在事件處理程序代碼中使ProgressBar
可見?
即使ObserableCollection
已經完成添加項目,如何判斷我的ListView
是否仍在更新?
<ProgressBar x:Name="GeneralProgressBar" Width="300" Height="15" IsIndeterminate="True" Visibility="Hidden"/>
private void SetPBar(bool isVisible)
{
if (isVisible)
GeneralProgressBar.Visibility = System.Windows.Visibility.Visible;
else
GeneralProgressBar.Visibility = System.Windows.Visibility.Hidden;
}
private void SetPBarHelper(Action handler)
{
SetPBar(true); // try to make ProgressBar visible
System.Windows.Forms.Application.DoEvents();
handler(); // use the event handling, which run database query
SetPBar(false); // try to make ProgressBar disappear
}
private void CommandForumImagesBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
SetPBarHelper(() =>
{
if (e.Parameter == null)
return;
var vm = e.Parameter as ForumViewModel;
if (vm != null)
{
}
});
}
public sealed class ImageGroupCollection : ObservableCollection<ImageGroup>
{
public ImageGroupCollection() : base() { }
public void Update(DateTime start, DateTime end)
{
ClearItems();
var list = MyDatabase.GetRecords(start, end);
if (list != null)
{
foreach (var g in list)
{
Add(g);
}
}
}
}
您的問題僅僅是因為您阻止了UI線程。 你不能這樣做。
當UI線程再次運行消息循環時,您已設置ProgressBar.Visible = false
。 從未繪制ProgressBar
。
假設您正在使用.net 4.5您需要重寫代碼,如下所示。
private async Task SetPBarHelper(Action handler)
{
SetPBar(true); // try to make ProgressBar visible
System.Windows.Forms.Application.DoEvents();
await Task.Run(handler); // use the event handling, which run database query
SetPBar(false); // try to make ProgressBar disappear
}
但總體而言,您需要盡快將UI線程的控制權返回給應用程序循環,以允許它重繪窗口,並在WorkerThread上運行更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.