在应用程序启动时提示文件

时间:2015-05-05 04:21:56

标签: c# windows-runtime winrt-xaml

我正在制作一个可能由同一个用户在多台计算机上使用的应用程序。我目前已经实现了备份和还原功能,以保持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()正在失去其返回值,这是用于测试目的的临时情况。一旦找到解决方案,我将确保将返回值分配给相关变量。

1 个答案:

答案 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)

也会在创建主窗口时调用一次。