Pracuję nad aplikacją Silverlight 3 z C#. Chciałbym umożliwić użytkownikowi pobranie obrazu z aplikacji Silverlight. Używam SaveFileDialog do wykonania zadania pobierania pliku. Przepływ jest następujący:"Dialogi muszą być inicjowane przez użytkownika." z SaveFileDialog w Silverlight 3
- Użytkownik klika przycisk Pobierz w aplikacji SL.
- wywołanie usługi sieci Web wywoływana uzyskać obraz z serwera
- OnCompleted obsługi zdarzeń asynchronicznych wstęgi wywołanie metody get wywoływana i odbiera obraz binarny z serwera
- W ramach obsługi zdarzeń OnCompleted, SaveFileDialog monit do użytkownika do zapisywania obraz do komputera.
- Przesyłanie obrazu do pliku na dysku twardym użytkownika.
Korzystam z następującego kodu w funkcji, która jest wywoływana z funkcji obsługi zdarzeń OnCompleted, aby wykonać monit SaveFileDialog, a następnie przesyłać strumieniowo do pliku.
SaveFileDialog dialog = new SaveFileDialog();
dialog.Filter = "JPG Files|*.jpg" + "|All Files|*.*";
bool? dialogResult = dialog.ShowDialog();
if (dialogResult == true)
{
using (Stream fs = (Stream)dialog.OpenFile())
{
fs.Write(e.Result, 0, e.Result.Length);
fs.Close();
}
}
Plik SaveFileDialog spowodowałby błąd "Dialogi muszą być inicjowane przez użytkownika". podczas wywoływania metody ShowDialog w powyższym kodzie. Czego tu nie mogę przegapić? Jak przezwyciężyć to?
Mam ten sam komunikat o błędzie próbuje użyć SaveFileDialog bezpośrednio z obsługi zdarzeń Button_Click bo robiłem trochę walidacji w metodzie przed wywołaniem nowego SaveFileDialog(). Poniższy link JumpingJezza pokazuje dobry przykład, ale wydaje się, że kluczem jest posiadanie nowego SaveFileDialog() jako * pierwszego * wiersza w procedurze obsługi zdarzeń przycisku. Potem możesz pozornie robić cokolwiek innego. – Jedidja
I "pierwsza" linia naprawdę oznacza _pierwszy_.Byłem debugowania ktoś kod elses i out skomentował blok kodu w obsługi zdarzeń kliknij przycisk spowodował wspomnianego wyjątku. – faester
Myślę, że to raczej problem czasu, zanim otwarty zapis jest otwarty. Jeśli umieścisz punkt przerwania przed dialogiem. Błąd programu SHowDialog(). Zobacz http://dotnetslang.wordpress.com/2011/03/12/using-the-savefiledialog-dialogs-must-be-user-initiated-exception/ – maxence51