У меня есть приложение Silverlight 5.1.10411.0 Вне браузера, которому НЕ доверяют, и я пытаюсь закрыть приложение, используя Метод App.Current.MainWindow.Close. Согласно документации, я могу использовать этот механизм только в том случае, если выполняется одно из следующих условий:
В своих попытках заставить это работать я придерживался предельно простой, и я вызываю метод непосредственно в коде обработчика события нажатия кнопки, как показано ниже, но это не имеет никакого эффекта.
void closeButton_Click(object sender, RoutedEventArgs e)
{
var mainWindow = Application.Current.MainWindow;
mainWindow.Close();
}
Когда я присоединяю отладчик и устанавливаю «Перерыв при возникновении исключения», я вижу исключение
SecurityException: Доступ к свойству или вызову метода не разрешено, если приложение не имеет повышенных разрешений или код был вызван действием, инициированным пользователем.
Есть идеи, почему мой код не считается действием, инициированным пользователем?
Я безуспешно пытался подключить обработчик событий как в XAML, так и в программном коде (не одновременно)
или
closeButton.Click += closeButton_Click;
.Я очень внимательно прочитал документацию User-Initiated Eventsи не понимаю, почему мой код не считается инициированным пользователем. Я пробовал это как в режиме отладки, так и в режиме выпуска, а также когда отладчик не подключен без успеха. Если я изменю «Требовать повышенного доверия при работе вне браузера» на true, вызов закрытия будет работать, как и ожидалось.
Я переопределил требования к приложению, чтобы обойти эту проблему, но мне действительно хотелось бы понять, что я делаю неправильно ;-)
Обновление: SonOfPirateответ указывает, что документация для этого метода неточна, но я не уверен. Используя инструмент отражения dotPeek, метод, вызывающий исключение,
private void CheckForPermissions()
{
if (!Application.Current.HasElevatedPermissions && !XcpImports.IsUserInitiatedAction() && Application.Current.ApplicationStarted)
throw new SecurityException(Resx.GetString("Window_AccessNotAllowed"));
}
Я нахожу это немного запутанным для чтения, поэтому я издевался над кодом и написал для него модульные тесты, как показано на этом gistи, как вы можете видеть из результатов, я должен быть в состоянии вызвать close из ненадежного приложения, при условии, что оно инициировано пользователем.
Сообщение об исключении безопасности.
Доступ к свойству или вызову метода не разрешен, если приложение не имеет повышенных разрешений или код не был вызван действием, инициированным пользователем.
также указывает, что это должно быть возможно, поэтому я возвращаюсь к вопросу — почему этот код не считается инициированным пользователем?