首先,抱歉问题的长度。
我正在更新一个 Silverlight for Windows Phone 7 应用程序,该应用程序当前将数据存储在多个 XML 文件中。我正在更新应用程序以使用 CompactSQL 数据库,并且在安装新版本后首次运行时,我必须将数据从 XML 文件迁移到数据库中。
我想要一个进度条(IsIndeterminate=false)向用户显示每个文件迁移到数据库的进度(因为该操作最多需要 2 分钟)。
问题在于,尽管 NotifyProperyChanged 事件触发并正确更新了进度条的值,但进度条并未在屏幕上更新(甚至显示)。当我在 XAML 中设置值时,它看起来很好(静态 - 但至少它是在屏幕上绘制的)。
我不知道为什么进度条根本没有出现在设备上。
我的 INotifyChanged 设置
private int migrateCount;
public int MigrateCount //Prop used for ProgressBar.Value
{
get
{
return this.migrateCount;
}
set
{
this.migrateCount = value;
NotifyPropertyChanged("MigrateCount");
}
}
public int MigrateTotal { get; set; } //Prop used for ProgressBar.Maximum
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
void MainPage_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "MigrateCount")
{
ProBar.Maximum = MigrateTotal; //ProBar is the name of my ProgressBar
ProBar.Value = MigrateCount;
}
}
public event PropertyChangedEventHandler PropertyChanged;
public MainPage()
{
this.PropertyChanged += new PropertyChangedEventHandler(MainPage_PropertyChanged);
...
}
在 Loaded 而不是 OnNavigatedTo 中调用 MigrateDB 方法,因为操作系统会终止任何加载时间过长的应用程序。
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
string[] dirs = store.GetDirectoryNames();
if (dirs.Length > 1) //Checks to see if there's any data to migrate
{
MigrateDB();
LoadData(); //Loads data from the DB once it's populated
}
}
此操作需要很长时间。每分钟大约 100 个 XML 文件,我希望用户拥有 30 到 300 个文件。
private void MigrateDB()
{
string[] DirList;
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
{
DirList = store.GetDirectoryNames("*");
MigrateTotal = DirList.Length - 1; // -1 to account for the "Shared" Dir
foreach(...)
{
... Does lots of IsoStore operations / XML serialising and DB updating
MigrateCount++;
}
}
...
}