Silverlight Out-of-Browser应用程序不会使用MainWindow.Close方法关闭

Mar*_*rth 8 silverlight silverlight-5.0

我有一个不受信任的Silverlight 5.1.10411.0 Out-of-Browser应用程序,我试图使用App.Current.MainWindow.Close方法关闭应用程序.根据文档,如果满足以下条件之一,我只能使用此机制:

  • 它是一个值得信赖的应用程序(对我的应用程序不适用
  • 在Application.Startup事件完成之前(对于我的应用程序不是这样)
  • 响应用户启动的操作,例如,在按钮Click事件处理程序中(这是我想要工作的)

在我试图让它工作的过程中,我保持了非常简单的操作,并且直接在按钮单击事件处理程序后面的代码中调用方法,如下所示,但它没有任何效果.

void closeButton_Click(object sender, RoutedEventArgs e)
{
    var mainWindow = Application.Current.MainWindow;
    mainWindow.Close();
}
Run Code Online (Sandbox Code Playgroud)

当我附加调试器并设置"抛出异常时中断"时,我可以看到异常

SecurityException:除非应用程序具有提升的权限,或者通过用户启动的操作调用了代码,否则不允许访问属性或方法调用.

有什么想法为什么我的代码不被视为用户启动的操作?

我已经尝试在XAML和代码隐藏中附加事件处理程序(不是同时)

 <Button x:Name="closeButton" Content="Close" Click="closeButton_Click" />
Run Code Online (Sandbox Code Playgroud)

要么

 closeButton.Click += closeButton_Click;
Run Code Online (Sandbox Code Playgroud)

没有成功.我已经非常仔细地阅读了用户启动的事件文档,并且无法理解为什么我的代码不被视为用户启动.我已经在调试和发布模式以及没有成功附加调试器时尝试了这一点.如果我将"在浏览器外部运行时需要提升的信任"更改为true,则close调用将按预期工作.

我已经重新定义了我的应用程序要求来解决这个问题,但我真的想了解我做错了什么;-)

更新:SonOfPirate的回答表明这种方法的文档不准确,但我不相信.使用反射工具dotPeek抛出异常的方法是

private void CheckForPermissions()
{
  if (!Application.Current.HasElevatedPermissions && !XcpImports.IsUserInitiatedAction() && Application.Current.ApplicationStarted)
    throw new SecurityException(Resx.GetString("Window_AccessNotAllowed"));
}
Run Code Online (Sandbox Code Playgroud)

我觉得这是一个有点混乱读,所以我一直嘲笑的代码,写它的单元测试见下面的要点,正如你可以从结果看,我应该能够从不受信任的应用程序调用Close,只要它是用户启动. 窗口关闭安全测试结果

安全异常消息

除非应用程序具有提升的权限,或者通过用户启动的操作调用了代码,否则不允许访问属性或方法调用.

也表明它应该是可能的,所以我回到了这个问题 - 为什么这个代码不被认为是用户启动的?

Son*_*ate 3

错误就在第一段,当您声明“只有在满足以下条件之一时才能使用此机制”时,请仔细阅读 MS 文档,您会发现他们没有说“一个”这些条件。以下是来自 MS 参考页的Close 方法的确切文本:

仅在以下情况下可以调用该方法:

  • 响应用户启动的操作,例如,在按钮 Click 事件处理程序中。
  • 在 Application.Startup 事件完成之前(即,在 IApplicationService.StartService 方法、IApplicationLifetimeAware.Starting 方法或 Startup 事件处理程序中)。
  • 在受信任的应用程序中。

正如您所看到的,您需要增强信任。

更新

我承认,对于前两种情况需要与第三种情况结合使用的情况,微软使用的措辞有点误导。如果更准确地表述为:也许会更清楚:

仅在以下任一情况下,您才能在受信任的应用程序中调用此方法:

  • 响应用户启动的操作,例如,在按钮 Click 事件处理程序中。
  • 在 Application.Startup 事件完成之前(即,在 IApplicationService.StartService 方法、IApplicationLifetimeAware.Starting 方法或 Startup 事件处理程序中)。