Приложение Silverlight вне браузера не закрывается с помощью метода MainWindow.Close

У меня есть приложение Silverlight 5.1.10411.0 Вне браузера, которому НЕ доверяют, и я пытаюсь закрыть приложение, используя Метод App.Current.MainWindow.Close. Согласно документации, я могу использовать этот механизм только в том случае, если выполняется одно из следующих условий:

  • Это доверенное приложение (не верно для моего приложения)
  • До завершения события Application.Startup (не верно для моего приложения). )
  • В ответ на действие, инициированное пользователем, например, в обработчике события Click кнопки (это то, что я пытаюсь заставить работать)

В своих попытках заставить это работать я придерживался предельно простой, и я вызываю метод непосредственно в коде обработчика события нажатия кнопки, как показано ниже, но это не имеет никакого эффекта.

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 из ненадежного приложения, при условии, что оно инициировано пользователем. Window Close Security Test Results

Сообщение об исключении безопасности.

Доступ к свойству или вызову метода не разрешен, если приложение не имеет повышенных разрешений или код не был вызван действием, инициированным пользователем.

также указывает, что это должно быть возможно, поэтому я возвращаюсь к вопросу — почему этот код не считается инициированным пользователем?

8
задан Community 23 May 2017 в 12:01
поделиться