Прежде всего, извините за длину вопроса.
Я обновляю приложение Silverlight для 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);
...
}
Вызов метода MigrateDB в Loaded, а не в OnNavigatedTo, поскольку ОС завершает работу любого приложения, загрузка которого занимает слишком много времени.
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++;
}
}
...
}