我正在制作一个可能由同一个用户在多台计算机上使用的应用程序。我目前已经实现了备份和还原功能,以保持SQLite数据库的同步。但是,当我安装应用程序的新副本时,我想提示用户选择备份文件(如果适用)。
最初,我认为我只会将MainPageViewModel.xaml
中的逻辑放在OnNavigatedTo
方法中。问题在于,每次导航回MainView
时都会运行该逻辑。所以,我认为将它放在OnApplicationLaunchAsync
中仅在应用程序启动时运行一次是有意义的。
这是我目前的代码:
private async Task<StorageFile> SelectFileAsync()
{
StorageFile pickedFile = null;
var settings = Container.Resolve<ISettings>();
var picker = new FileOpenPicker();
picker.FileTypeFilter.Add(".sqlite");
picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
var file = await picker.PickSingleFileAsync();
if (file != null)
{
var pickedFileToken = StorageApplicationPermissions.FutureAccessList.Add(file);
settings.BackupFileToken = pickedFileToken;
pickedFile = file;
}
return pickedFile;
}
protected async override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args)
{
var navigationService = Container.Resolve<INavigationService>();
var dialogService = Container.Resolve<IDialogService>();
var settings = Container.Resolve<ISettings>();
if (!string.IsNullOrEmpty(settings.BackupFileToken))
{
var backupFile =
await StorageApplicationPermissions.FutureAccessList.GetFileAsync(settings.BackupFileToken);
var properties = await backupFile.GetBasicPropertiesAsync();
dialogService.Show(string.Format("Backup file found: {0}\r\n" +
"Modified date: {1}", backupFile.Path, properties.DateModified), "");
navigationService.Navigate(Experiences.Main);
}
else
{
navigationService.Navigate(Experiences.Blank);
//dialogService.Show("No backup file specified. Please choose a backup file location.", "");
// TODO: load blank page, then select backup file location, then navigate to main page
await SelectFileAsync();
}
// do not need to return Task.FromResult when OnLaunchApplicationAsync() is async
//return Task.FromResult<object>(null);
}
如您所见,如果BackupFileToken
存在,它将检查文件的属性并显示包含文件路径和上次修改日期的对话框。我的问题在于它是新安装/备份令牌不存在的情况。
如果我尝试在FileOpenPicker
之前显示对话框,则应用程序崩溃。我想也许可以添加一个空白视图导航到,然后显示对话框和FileOpenPicker
。似乎应该有一种更简单的方法来实现这一点(不需要额外的视图)。
有人可以推荐一种方法来提示用户在应用程序启动时选择文件,但让他们知道FileOpenPicker
的目的吗?
我知道我的await SelectFileAsync()
正在失去其返回值,这是用于测试目的的临时情况。一旦找到解决方案,我将确保将返回值分配给相关变量。
答案 0 :(得分:0)
也许你可以使用覆盖
java -cp ~/Public/apache-storm-0.9.4/lib/storm-core-0.9.4.jar com.a.b.HelloStorm
中的 protected override void OnWindowCreated(WindowCreatedEventArgs args)
也会在创建主窗口时调用一次。