Диалоги должны инициироваться пользователем. с SaveFileDialog в Silverlight 3

Я работаю над приложением Silverlight 3 с C #. Я хотел бы разрешить пользователю загружать изображение из приложения Silverlight. Я использую SaveFileDialog для выполнения задачи загрузки файла. Поток идет следующим образом:

  1. Пользователь нажимает кнопку «Загрузить» в приложении SL.
  2. Вызов веб-службы вызван для получения изображения с сервера
  3. OnCompleted вызывает обработчик асинхронных событий вызова веб-метода и получает двоичное изображение с сервера.
  4. В обработчике событий OnCompleted SaveFileDialog предлагает пользователю сохранить изображение на компьютер.
  5. Потоковое изображение в файл на жестком диске пользователя.

Я использую следующий код в функции, которая вызывается из обработчика событий OnCompleted для выполнения приглашения SaveFileDialog, а затем потоковой передачи в файл.

            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();
                }
            }

SaveFileDialog выдает ошибку «Диалоги должны быть инициированы пользователем». при вызове метода ShowDialog в приведенном выше коде. Что я мог здесь упустить? Как это побороть?


person pencilslate    schedule 30.08.2009    source источник


Ответы (5)


Это сообщение об ошибке означает, что вы можете отображать SaveFileDialog только в ответ на событие, инициированное пользователем, например нажатие кнопки. В описываемом вами примере вы показываете SaveFileDialog не в ответ на щелчок, а в ответ на завершенный HTTP-запрос (который не считается инициированным пользователем событием). Итак, что вам нужно сделать, чтобы это заработало, так это в событии Completed http-запроса показать пользователю пользовательский интерфейс с надписью «загрузка завершена, щелкните здесь, чтобы сохранить файл на свой компьютер», и когда пользователь щелкнет в этом сообщении отобразите SaveFileDialog.

person KeithMahoney    schedule 31.08.2009
comment
Я получил то же сообщение об ошибке, пытаясь использовать SaveFileDialog непосредственно из обработчика событий Button_Click, потому что я выполнял некоторую проверку в методе перед вызовом new SaveFileDialog (). Ссылка JumpingJezza ниже показывает хороший пример, но похоже, что ключ должен иметь new SaveFileDialog () в качестве первой строки в обработчике событий кнопки. После этого вы, казалось бы, можете делать все, что захотите. - person Jedidja; 17.05.2011
comment
И первая строка действительно означает first. Я отлаживал чей-то код elses, и закомментированный блок кода в обработчике события нажатия кнопки вызвал упомянутое исключение. - person faester; 29.02.2012
comment
Я думаю, это скорее проблема времени до открытия сохраненного диалога. Если поставить точку останова перед dialog.ShowDialog (), произойдет ошибка. См. dotnetslang. wordpress.com/2011/03/12/ - person maxence51; 28.06.2013

Как насчет того, чтобы сначала спросить, прежде чем скачивать? Судя по сообщению об ошибке, это наводит на мысль, что Silverlight хочет, чтобы вы просили вас убедиться, что он знает, что пользователь запросил действие, а не вы рассылаете пользователю всплывающие окна.

Помимо модели безопасности Silverlight, я бы предпочел не дожидаться завершения загрузки, прежде чем меня спросят, куда ее поставить!

person Ray Hayes    schedule 31.08.2009

Как сказал Кейт, это сделано специально. В этом руководстве представлен отличный пример использования кода, который Я раньше скачивал файл с сервера "правильным" способом. (Также работает в Silverlight 4)

person JumpingJezza    schedule 08.12.2010
comment
Вы также можете создать SaveFileDialog в обработчике событий кнопки. Главное - убедиться, что конструктор является первой строкой метода. - person Jedidja; 17.05.2011

Я только начал работать с Silverlight 4 и столкнулся с той же проблемой. Кажется, что если вы вручную создаете обработчики событий, возникает исключение безопасности, даже если обработчик событий обрабатывает событие нажатия кнопки с правильными параметрами, но если вы используете параметр «создать новый обработчик событий» на кнопке в Xaml под событием щелчка теперь работает новый обработчик событий с тем же кодом и параметрами .... это одна из многих "пробковых" вещей, с которыми я столкнулся с момента начала перехода от WPF к Silverlight.

person Greg S    schedule 06.01.2011

person    schedule
comment
Не могли бы вы пояснить свой ответ более подробно? Ответы должны указывать направление, а не только код c / p. - person CodeMouse92; 23.10.2014