Подход состоит в том, чтобы сначала открыть SaveFileDialog
в результате некоторого взаимодействия с пользователем, такого как нажатие кнопки.После того, как пользователь определил, куда сохранить загрузку, и метод SaveDialog
возвратил, вы сохраняете этот экземпляр SaveFileDialog
под рукой.
Затем вы вызываете загрузку, и в OpenReadCompleted
вы можете использоватьSaveFileDialog
OpenFile
метод для получения потока, в который вы можете накачать результат.
public void SaveAs()
{
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "All Files|*.*";
bool? dialogResult = dialog.ShowDialog();
if (dialogResult != true) return;
WebClient webClient = new WebClient();
webClient.OpenReadCompleted += (s, e) =>
{
try
{
using (Stream fs = (Stream)dialog.OpenFile())
{
e.Result.CopyTo(fs);
fs.Flush();
fs.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
};
webClient.OpenReadAsync(new Uri("http://testurl/test.docx"), UriKind.Absolute);
}
Вы заметите, что код не только чище и проще, но если пользователь в конечном итоге отменитSaveFileDialog Вы не потратили впустую свое время или пропускную способность, загружая файл.