首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Silverlight离开浏览器应用程序将不会使用MainWindow.Close方法关闭。

Silverlight离开浏览器应用程序将不会使用MainWindow.Close方法关闭。
EN

Stack Overflow用户
提问于 2012-06-29 02:47:32
回答 2查看 879关注 0票数 8

我有一个Silverlight 5.1.10411.0 跳出浏览器应用程序,即不可信,我正在尝试使用App.Current.MainWindow.Close方法关闭应用程序。根据文档,只有在其中一个条件为真的情况下,我才能使用此机制:

  • 它是一个可信的应用程序(对于我的应用程序不是这样)
  • 在Application.Startup事件完成之前(对我的应用程序不适用)
  • 为了响应用户发起的操作,例如,在一个按钮单击事件处理程序中(这就是我要做的)。

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

代码语言:javascript
代码运行次数:0
运行
复制
void closeButton_Click(object sender, RoutedEventArgs e)
{
    var mainWindow = Application.Current.MainWindow;
    mainWindow.Close();
}

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

SecurityException:不允许访问属性或方法调用,除非应用程序具有提升的权限,或者代码是通过用户发起的操作调用的。

知道为什么我的代码不被认为是用户发起的操作吗?

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

代码语言:javascript
代码运行次数:0
运行
复制
 <Button x:Name="closeButton" Content="Close" Click="closeButton_Click" />

代码语言:javascript
代码运行次数:0
运行
复制
 closeButton.Click += closeButton_Click;

但没有成功。我已经非常仔细地阅读了用户启动的事件文档,并且无法理解为什么我的代码没有被认为是用户启动的。我已经尝试过在调试和发布模式,以及当没有附加调试器,但没有成功。如果我将“在浏览器外部运行时要求提升信任”更改为true,则密切调用将按预期工作。

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

UpdateSonOfPirate的回答表明该方法的文档不准确,但我不相信。

代码语言:javascript
代码运行次数:0
运行
复制
private void CheckForPermissions()
{
  if (!Application.Current.HasElevatedPermissions && !XcpImports.IsUserInitiatedAction() && Application.Current.ApplicationStarted)
    throw new SecurityException(Resx.GetString("Window_AccessNotAllowed"));
}

我觉得这有点让人费解,所以我已经模拟了代码,并为它编写了单元测试,如这个要旨所示,正如您从结果中看到的,我应该能够从不受信任的应用程序调用close,前提是它是用户启动的。

安全异常消息

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

还指出这应该是可能的,所以我回到了这个问题--为什么这段代码不被认为是用户启动的?

EN

回答 2

Stack Overflow用户

发布于 2012-07-04 13:24:34

错误就在第一段中,当你说“只有当其中一个条件是正确的时候,你才能使用这个机制:”重读MS文档,你会发现他们没有说这些条件中的“一个”。以下是闭合法的MS参考页面中的确切文本

只有在以下情况下才能调用此方法:

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

正如您所看到的,您需要启用更高的信任。

更新

我承认,微软使用的措辞对前两种情况和第三种情况都有一定的误导性。如果措辞更准确,也许会更清楚:

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

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

Stack Overflow用户

发布于 2014-02-10 06:05:30

如何在silverlight:中提高webBrowser控件的权限

1- http://msdn.microsoft.com/en-us/library/gg192793%28v=vs.96%29.aspx主题:启用浏览器内受信任应用程序的

2- http://www.johnpapa.net/digitally-signing-a-xap-silverlight/主题:数字签名XAP Silverlight

3- http://chainding.wordpress.com/2012/09/19/silverlight-5-trusted-applications/主题:添加必要的注册表设置签名XAP文件部署证书

并确保已签名证书部署在本地计算机和当前用户的受信任发布服务器中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11255442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档