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

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

概述我有一个Silverlight 5.1.10411.0 Out-of-Browser应用程序,它是 NOT trusted,我试图使用 App.Current.MainWindow.Close方法关闭应用程序.根据文档,如果满足以下条件之一,我只能使用此机制: >这是一个值得信赖的应用程序(不适用于我的应用程序) >在Application.Startup事件完成之前(对我的应用程序不适用) >响 我有一个Silverlight 5.1.10411.0 Out-of-Browser应用程序,它是 NOT trusted,我试图使用 App.Current.MainWindow.Close方法关闭应用程序.根据文档,如果满足以下条件之一,我只能使用此机制:

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

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

voID closebutton_Click(object sender,RoutedEventArgs e){    var mainWindow = Application.Current.MainWindow;    mainWindow.Close();}

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

SecurityException: Access to the property or method call is not
allowed unless the application has elevated permissions,or the code
was called through a user initiated action.

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

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

<button x:name="closebutton" Content="Close" Click="closebutton_Click" />

要么

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,前提是它是用户启动.

安全异常消息

Access to the property or method call is not allowed unless the application has elevated permissions,or the code was called through a user initiated action.

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

解决方法 如果您声明“如果其中一个条件成立,您只能使用此机制”,那么错误就出现在第一段中:“重新阅读MS文档,您会看到他们没有说”一个“这些条件.以下是 Close method的MS参考页面中的确切文本:

You can call this method only in the following cases:

In response to a user-initiated action,for example,in a button Click event handler. Before the Application.Startup event has completed (that is,in an Iapplicationservice.StartService method,an IApplicationlifetimeAware.Starting
method,or a Startup event handler). In a trusted application.

如您所见,您需要启用提升的信任.

UPDATE

我承认,微软使用的措辞有点误导,与前三种情况相结合的前两种情况都是如此.如果措辞更准确,也许会更清楚:

You can call this method only in a trusted application in either of the following cases:

In response to a user-initiated action,an IApplicationlifetimeAware.Starting method,or a Startup event handler).
总结

以上是内存溢出为你收集整理的Silverlight Out-of-Browser应用程序不会使用MainWindow.Close方法关闭全部内容,希望文章能够帮你解决Silverlight Out-of-Browser应用程序不会使用MainWindow.Close方法关闭所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1002800.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存