Possiedo un'applicazione Silverlight 5.1.10411.0 Out-of-Browser che è NOT trusted e sto tentando di chiudere l'applicazione utilizzando il metodo App.Current.MainWindow.Close. Secondo la documentazione posso solo usare questo meccanismo se una di queste condizioni:L'applicazione Silverlight Out-of-Browser non si chiude utilizzando il metodo MainWindow.Close
- Si tratta di un'applicazione di fiducia (non è vero per la mia applicazione)
- Prima dell'evento Application.Startup ha completato (non è vero per la mia applicazione)
- in risposta ad un'azione avviata dall'utente, ad esempio, in un gestore di pulsante evento Click (questo è quello che sto cercando di andare al lavoro)
nei miei tentativi di ottenere questo a lavoro Ho mantenuto le cose estremamente semplici e sto chiamando direttamente il metodo un codice dietro il gestore di eventi click del pulsante come mostrato sotto ma non ha alcun effetto.
void closeButton_Click(object sender, RoutedEventArgs e)
{
var mainWindow = Application.Current.MainWindow;
mainWindow.Close();
}
Quando ho connettere il debugger e impostare "Break quando viene generata un'eccezione" Posso vedere l'eccezione
SecurityException: L'accesso alla chiamata proprietà o metodo non è ammissibile a meno che l'applicazione ha autorizzazioni elevate o il codice è stato richiamato tramite un'azione avviata dall'utente.
Qualche motivo per cui il mio codice non viene considerato un'azione avviata dall'utente?
Ho provato allegando il gestore eventi sia XAML e nel codice-dietro (non allo stesso tempo)
<Button x:Name="closeButton" Content="Close" Click="closeButton_Click" />
o
closeButton.Click += closeButton_Click;
senza successo. Ho letto la documentazione User-Initiated Events con molta attenzione e non vedo perché il mio codice non è considerato avviato dall'utente. Ho provato questo in entrambe le modalità di debug e di rilascio, nonché quando nessun debugger è collegato senza successo. Se cambio "Richiedi affidabilità elevata quando si esegue all'esterno del browser" per essere vero, la chiamata vicina funziona come previsto.
ho ridefinito le mie esigenze applicative Per ovviare a questo problema, ma mi piacerebbe davvero capire che cosa sto facendo male ;-)
Aggiornamento: SonOfPirate 's risposta indicare che la documentazione relativa a questo il metodo non è preciso ma non ne sono convinto. Utilizzando lo strumento riflessione dotPeek il metodo che sta gettando l'eccezione è
private void CheckForPermissions()
{
if (!Application.Current.HasElevatedPermissions && !XcpImports.IsUserInitiatedAction() && Application.Current.ApplicationStarted)
throw new SecurityException(Resx.GetString("Window_AccessNotAllowed"));
}
Ho trovato questo un po 'di confusione per leggere così ho deriso il codice e scritto unit test per esso, come mostrato da questo gist e, come si può dai risultati dovrei essere in grado di chiamare da vicino un'applicazione non affidabile, a condizione che sia avviata dall'utente.
L'eccezione di protezione messaggio
accesso alla chiamata proprietà o metodo non è consentito a meno che l'applicazione ha elevato le autorizzazioni, oppure il codice è stato chiamato attraverso un'azione dell'utente iniziati.
indica anche che dovrebbe essere possibile così sono tornato alla domanda: perché questo codice non è considerato avviato dall'utente?
Hai diverse finestre? – jv42
No, solo la singola MainWindow. –
Hai provato a utilizzare il comando del pulsante? Non dovrebbe cambiare nulla però. – jv42