ProgressBar更新为字典加载

时间:2012-03-27 15:09:32

标签: c# wpf binding dictionary progress-bar

嗯,我想我知道答案,但我很感激任何人确认我怀疑的。

我有大量dictionary个邮政编码需要在程序启动时加载。它需要10-15秒,我希望有progressbar可以显示进度。我可以制作进度条,并将总计数指定为设置。但是从我在其他问题上发现的情况来看,dictionary.count似乎无法与进度条绑定,并希望定期更新。

这是真的吗?如果是这样,还有另一种方式吗?

现在字典是硬编码的,但我打算在将来的某个时候改变它,并从文件中加载它。我知道在那一点上我可以使用foreach循环每次更新计数,但这似乎是一种kludge-ish。有没有更好的实施方式?

修改

根据要求,加载zipcode的字典的代码(实际上有大约40,000个条目,但我想我会节省空间:p):

static class ZipCodes
{
    #region Methods
    public static string GetValue(string key)
    {
        string result;
        if (zipCodeDictionary.TryGetValue(key, out result))
        {
            return result;
        }
        else
        {
            return null;
        }
    }

    public static int GetCount()
    {
        return zipCodeDictionary.Count();
    }
    #endregion


    #region ZipCode Dictionary Definition
    static Dictionary<string, string> zipCodeDictionary = new Dictionary<string, string>();

    public static void PopulateZipCodeDictionary()
    {
        zipCodeDictionary.Add( "00501", "Holtsville, NY" );
        zipCodeDictionary.Add( "00544", "Holtsville, NY" );
        zipCodeDictionary.Add( "00601", "Adjuntas, PR" );
        zipCodeDictionary.Add( "00602", "Aguada, PR" );
        zipCodeDictionary.Add( "00603", "Aguadilla, PR" );
        zipCodeDictionary.Add( "00604", "Aguadilla, PR" );

3 个答案:

答案 0 :(得分:2)

最简单的方法是拥有不确定的进度条。但是,如果要显示绑定的进度条,可以实现INotifyPropertyChanged,并且具有一个公共属性,该属性也会随着每个Add操作而增加,并且进度条绑定到此属性。

static class ZipCodes: INotifyPropertyChanged
{
#region Methods
public static string GetValue(string key)
{
    string result;
    if (zipCodeDictionary.TryGetValue(key, out result))
    {
        return result;
    }
    else
    {
        return null;
    }
}

public static int GetCount()
{
    return zipCodeDictionary.Count();
}
#endregion

#region property
private static int progress=0;
Public static int LoadingProgress
{
    get
    {
    return progress;
    }
    set
    {
    if(value!=progress)
        {
            progress = value;
            NotifyPropertyChanged("LoadingProgress");
        }
    }
}   
#endregion

#region INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

#endregion


#region ZipCode Dictionary Definition
static Dictionary<string, string> zipCodeDictionary = new Dictionary<string, string>();

public static void PopulateZipCodeDictionary()
{
    zipCodeDictionary.Add( "00501", "Holtsville, NY" );
    LoadingProgress++;
    zipCodeDictionary.Add( "00544", "Holtsville, NY" );
    LoadingProgress++;
    zipCodeDictionary.Add( "00601", "Adjuntas, PR" );
    LoadingProgress++;

答案 1 :(得分:1)

您可以通过派生Dictionary<TKey, TValue>来创建自己的字典实现。此实现还可以实现接口INotifyCollectionChanged并在调用覆盖的Add方法时引发事件。然后,您的应用程序可以收听此事件并相应地更新进度条。

话虽如此,我不会这样做。如果加载只需几秒钟,我只会显示一个不确定的进度条。它更简单,更充足。

答案 2 :(得分:1)

如果加载过程确实需要很长时间,您可以使用BackgroundWorker。继承人怎么做

  1. 创建BackgroundWorker对象。

  2. 将其WorkerReportsProgress属性设置为True。

  3. 处理DoWork事件以加载字典,定期报告进度

    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        // Code to add entries to dictionary
        ...
    
        // Periodically, report progress using this call (in percentage)
        backgroundWorker.ReportProgress(percentProgress);
    }
    
  4. 处理ProgressChanged事件以更新进度条

    private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }