Проблема с SaveFileDialog в Silverlight 3 - PullRequest
1 голос
/ 01 октября 2009

У меня есть странное исключение от SaveFileDialog в Silverlight 3. У меня нет идеи, в чем проблема.

Я создаю экземпляр SaveFileDialog в Загруженное событие пользовательского элемента управления. После нажатия кнопки Загрузка и запуска dialogResult is true асинхронная загрузка файла После завершения загрузки файла вызывается метод OpenFile (). Это прекрасно работает один раз, но во второй раз я получаю исключение:

Сообщение об исключении:

"No file was selected"

подробности:

{System.InvalidOperationException: No file was selected.
   at System.Windows.Controls.SaveFileDialog.OpenFile()
   at Spaces.Client.Views.Dialogs.FileDialog.BL_DownloadFileCompleted(Object sender, EventArguments`1 e)
   at Spaces.Client.BL.Interface.DownloadFileCompletedEventHandler.Invoke(Object sender, EventArguments`1 e)
   at Spaces.Client.BL.WebService.SpacesService._spacesService_DownloadFileCompleted(Object sender, DownloadFileCompletedEventArgs e)
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at Spaces.Client.BL.SpacesServiceReference.ServiceClient.OnDownloadFileCompleted(Object state)}

Stack:

   at System.Windows.Controls.SaveFileDialog.OpenFile()
   at Spaces.Client.Views.Dialogs.FileDialog.BL_DownloadFileCompleted(Object sender, EventArguments`1 e)
   at Spaces.Client.BL.Interface.DownloadFileCompletedEventHandler.Invoke(Object sender, EventArguments`1 e)
   at Spaces.Client.BL.WebService.SpacesService._spacesService_DownloadFileCompleted(Object sender, DownloadFileCompletedEventArgs e)
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at Spaces.Client.BL.SpacesServiceReference.ServiceClient.OnDownloadFileCompleted(Object state)

Вот фрагмент кода:

private void _userControlFileDialog_Loaded(object sender, RoutedEventArgs e)
        {
            _comboBoxVersions.ItemsSource = _file.Versions;
            if (_comboBoxVersions.Items.Count > 0)
                _comboBoxVersions.SelectedIndex = 0;

            String extension = "*." + _file.Extension;

            _sfd = new SaveFileDialog();
            _sfd.DefaultExt = _file.Extension;
            _sfd.Filter = extension + "|" + extension;
        }

        private void _hyperlinkButtonDownload_Click(object sender, RoutedEventArgs e)
        {
            string path = ((FileVersion)_comboBoxVersions.SelectedItem).Url;

            bool? dialogResult = _sfd.ShowDialog();

            if (dialogResult == true)
            {
                AppContext.BL.DownloadFileCompleted += new Spaces.Client.BL.Interface.DownloadFileCompletedEventHandler(BL_DownloadFileCompleted);
                AppContext.BL.DownloadFileAsync(AppContext.AuthenticatedUser, path);
            }
        }

        void BL_DownloadFileCompleted(object sender, Spaces.Client.BL.Interface.EventArguments<byte[]> e)
        {
            byte [] data = e._result;

            using (Stream fileStream = (Stream)_sfd.OpenFile())
            {
                fileStream.Write(data, 0, data.Length);
                fileStream.Flush();
                fileStream.Close();
            }

        }

Кто-нибудь знает, что не так?

С уважением Антон Калчик

1 Ответ

0 голосов
/ 20 октября 2009

Возникла проблема с несколькими обработчиками событий. К каждому клику прикрепляется обработчик событий и он никогда не отключается. Обработчик событий остается подключенным и после закрытия UserControl. Поэтому разработчик должен правильно отсоединить обработчик событий.

С уважением AKA

...