So Im now told that the FileSavePicker only creates a blank file, and that Ill have to write additional code to then actually write to the file. Ive started a Task WriteToFile after the FileSavePicker but Im unsure how to finish it. With the FileSavePicker, the user selects the folder they wish to save the file to. Where do I point to that in the WriteToFile code and how exactly do I put the file source in it? The files to be saved are all packaged with the app. Im using x.mp3 as an example here.
public class SoundData : ViewModelBase
{
public string Title { get; set; }
public string FilePath { get; set; }
public RelayCommand<string> SaveSoundAs { get; set; }
private async void ExecuteSaveSoundAs(string soundPath)
{
string path = @"appdata:/x.mp3";
StorageFolder folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
StorageFile file = await folder.GetFileAsync(path);
{
FileSavePicker savePicker = new FileSavePicker();
savePicker.SuggestedSaveFile = file;
savePicker.FileTypeChoices.Add("MP3", new List<string>() { ".mp3" });
savePicker.ContinuationData.Add("SourceSound", soundPath);
savePicker.SuggestedFileName = this.Title;
savePicker.PickSaveFileAndContinue();
}
}
public async void ContinueFileSavePicker(FileSavePickerContinuationEventArgs args)
{
string soundPath = (string)args.ContinuationData["SourceSound"];
StorageFile file = args.File;
if (file != null)
{
// Prevent updates to the remote version of the file until we finish making changes and call CompleteUpdatesAsync.
CachedFileManager.DeferUpdates(file);
// write to file
await FileIO.WriteTextAsync(file, file.Name);
// Let Windows know that we're finished changing the file so the other app can update the remote version of the file.
// Completing updates may require Windows to ask for user input.
FileUpdateStatus status = await CachedFileManager.CompleteUpdatesAsync(file);
if (status == FileUpdateStatus.Complete) ;
}
}
public SoundData()
{
SaveSoundAs = new RelayCommand<string>(ExecuteSaveSoundAs);
}
}
}
For Windows Phone you should follow this How to documentation. The workflow has changed quite a bit from Silverlight apps. Your app no longer resumes like it used to with the old Tasks.
You don't need to follow all of the steps in the doc, but an important piece is to over the
OnActivated
method within App.xaml.cs. Within there you will call your ContinueFileSavePicker method.Here is a sample that you can download as well that should help.
Update
If you want to save a file that you will be shipping with your app, try the following code to initialize the picker
You also need to make sure that you listen to the ContractActivated event of the PhoneApplicationService. This event is fired (in 8.1 Silverlight apps) when the app returns from the picker. This is where you want to call your ContinueFileSavePicker method. If you wanted, you could always just put the logic in there.
Subscribe to the event in xaml:
And in the App.xaml.cs: