2015-07-23 2 views
1

При запуске приложения для Windows Store я хочу предложить пользователю выбрать локальную папку хранения с помощью FolderPicker и сохранить ее с помощью FutureAccessList. Приглашение, которое я использую, - MessageDialog.Запуск FilePicker или FolderPicker из UICommand/MessageDialog

protected async override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 

    var messageDialog = new MessageDialog("Please pick a folder where you'd like to store your documents", "Choose storage"); 
    messageDialog.Commands.Clear(); 
    messageDialog.Commands.Add(new UICommand("OK", async (command) => 
    { 
     await PickFolder(); 
    }); 
    await messageDialog.ShowAsync(); 
} 

private async Task PickFolder() 
{ 
    FolderPicker folderPicker = new FolderPicker(); 
    folderPicker.SuggestedStartLocation = PickerLocationId.Desktop; 
    folderPicker.FileTypeFilter.Add(".txt"); 
    folder = await folderPicker.PickSingleFolderAsync(); 
    // lets just ignore cancellations for now 
    StorageApplicationPermissions.FutureAccessList.AddOrReplace("MyFolder", folder); 
} 

Этот код не работает - я получаю ошибка доступа

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) 

Я думал, что с помощью messageDialog.ShowAsync() было достаточно, чтобы обойти эту проблему, но это не похоже на работу. Есть идеи?

Должен ли я отказаться от симпатичного сообщения WinRTDialogs в пользу чего-то домашнего роста?

+0

Попробуйте создать сообщениеDialog в событии OnLoaded. – crea7or

+0

@ crea7or nope, тот же результат – roryok

+0

Произошла ли ошибка до появления сообщения или после нажатия «ОК»? – micbobo

ответ

3

Команда MessageDialog срабатывает до того, как она закрывается, и вы не можете открыть второй модальный диалог, пока первый по-прежнему не работает.

Вам необходимо отложить вызов PickFolder до завершения MessageDialog. Поскольку вы его все равно ожидаете, вы можете позвонить ему после ShowAsync. Это спорный вопрос, так как здесь хорошо это единственный вариант, но вы можете переключиться на команду выбранной выбирать между несколькими вариантами.

protected async override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 

    var messageDialog = new MessageDialog("Please pick a folder where you'd like to store your documents", "Choose storage"); 
    messageDialog.Commands.Clear(); 
    UICommand okCommand = new UICommand("Ok"); 
    messageDialog.Commands.Add(okCommand); 
    var cmd = await messageDialog.ShowAsync(); 
    if (cmd == okCommand) 
    { 
     await PickFolder(); 
    } 
} 

Другим вариантом было бы, чтобы добавить задержку (например, путем вызова PickFolder в блоке Dispatcher.RunAsync) внутри обработчика UICommand перед вызовом PickFolder так, чтобы MessageDialog можно закрыть.

Смежные вопросы