簡體   English   中英

WPF進度條未顯示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM