Mi aplicación tiene un botón de "abrir archivo". Antes de abrir OpenFileDialog, pregunta si el usuario desea guardar el archivo actual y, si lo hace, inicia SaveFileDialog. A continuación, inicia el OpenFileDialog. Bastante estándar.¿Alguna forma de eludir la excepción "Los cuadros de diálogo deben ser iniciados por el usuario"?
Mi problema es que Silverlight ve el método OpenFileDialog.ShowDialog() como no iniciado por el usuario, y recibo una SecurityException.
¿Se conoce alguna forma razonable de evitar esta excepción? Sin duda, este es un escenario bastante estándar?
La aplicación está dentro de un navegador.
Cualquier idea bienvenida
EDIT:
Lo sentimos, no se les permite liberar código real :(La lógica es bastante simple sin embargo: En el psuedocode 'OpenFile caso pulse el botón" llama a un método algo como:
* Lanzar un nuevo mensaje SL preguntando si desea guardar primero
* en la ventana de mensaje si/no hace clic en:. -Si no, vaya a cargar -Si Sí, Lanzamiento SaveFileDialog.Sho wDialog(), vaya a cargar
* Capacidad de carga: iniciar un archivo de diálogo Abrir
EDIT 2: Mini programa ...
contenido XML para la página principal:
<Grid x:Name="LayoutRoot" Background="White">
<Button Content="Open" Click="Button_Click"/>
</Grid>
Código:
using System.Windows;
using System.Windows.Controls;
namespace SilverlightApplication15
{
public partial class MainPage : UserControl
{
AskWindow aw = new AskWindow();
public MainPage()
{
InitializeComponent();
aw.Closed += new System.EventHandler(aw_Closed);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
aw.Show();
}
private void aw_Closed(object sender, System.EventArgs e)
{
if (aw.DialogResult == true)
{
SaveFileDialog svd = new SaveFileDialog();
svd.ShowDialog();
}
OpenFileDialog ofd = new OpenFileDialog();
ofd.ShowDialog();//Causes security exception
}
}
public class AskWindow : ChildWindow
{
public AskWindow()
{
Button b = new System.Windows.Controls.Button();
b.Click += new System.Windows.RoutedEventHandler(b_Click);
b.Content = "Yes, save it";
this.Content = b;
}
private void b_Click(object sender, System.Windows.RoutedEventArgs e)
{
this.DialogResult = true;
}
}
}
Puedes publicar el código que tienes. – ChrisF
¿Ha intentado escribir el método de extensión para ShowDialog() como ShowDialog (pregunta de cadena) que primero mostraría MsgBox y luego posiblemente llamaría a ShowDiaglog básico()? – neurotix
@neurotix: Acabo de probarlo; mismo resultado me temo :( – user495625