Estoy trabajando en una aplicación Silverlight 3 con C#. Me gustaría permitir que el usuario descargue una imagen de la aplicación Silverlight. Estoy usando SaveFileDialog para realizar la tarea de descarga de archivos. El flujo va de esta manera:"Los cuadros de diálogo deben ser iniciados por el usuario". con SaveFileDialog en Silverlight 3
- El usuario hace clic en el botón Descargar en la aplicación SL.
- llamada de servicio Web invoca para obtener la imagen del servidor
- OnCompleted controlador de eventos asincrónicos de la llamada al método web Cómo invocado y recibe la imagen binaria del servidor
- Dentro del controlador de eventos OnCompleted, SaveFileDialog impulsó a los usuarios para ahorrar la imagen a la computadora.
- Transmita la imagen al archivo en el disco duro del usuario.
Estoy utilizando el siguiente código en una función que se llama desde el controlador de eventos OnCompleted para llevar a cabo el aviso SaveFileDialog y luego la transmisión al archivo.
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();
}
}
El SaveFileDialog tiraría el error "Diálogos deben ser iniciados por el usuario." al invocar el método ShowDialog en el código anterior. ¿Qué podría estar perdiendo aquí? ¿Cómo superar esto?
Recibí el mismo mensaje de error tratando de usar SaveFileDialog directamente desde un controlador de eventos Button_Click porque estaba haciendo alguna validación en el método antes de llamar a un nuevo SaveFileDialog(). El enlace de JumpingJezza a continuación muestra un buen ejemplo, pero parece que la clave es tener un nuevo SaveFileDialog() como la * primera * línea en el controlador de eventos de tu botón. Después de eso, aparentemente puedes hacer lo que quieras. – Jedidja
Y la "primera" línea realmente significa _primero_.Estaba depurando el código de alguien más y un bloque de código comentado en un controlador de evento de clic de botón provocó la excepción mencionada. – faester
Creo que esto es más bien un problema de tiempo antes de que se abra el archivo de registro de guardado. Si coloca un punto de interrupción antes del cuadro de diálogo, se produce el error ShowDialog(). Consulte http://dotnetslang.wordpress.com/2011/03/12/using-the-savefiledialog-dialogs-must-be-user-initiated-exception/ – maxence51