Browser.HtmlPage.Window.Navigate被阻止但HyperlinkBut​​ton不是 - 为什么?

时间:2011-02-24 05:51:11

标签: silverlight navigation popup-blocker

我有一个特定的UI元素,点击后该元素应导航到另一个URL。 我尝试处理鼠标按下事件并执行以下操作:     System.Windows.Browser.HtmlPage.Window.Navigate(新的Uri(" http://google.com")," _blank");

但是,除非我禁用弹出窗口拦截器,否则浏览器会阻止它(我尝试使用Chrome和Firefox)。 我做了一些研究,似乎浏览器阻止了由于用户交互而不会发生的导航,就浏览器而言,这个导航是由插件(Silverlight)发起的,而不是用户。

好的,有道理。但后来我尝试使用HyperlinkBut​​ton而不是阻止它。

我想知道为什么这两种方法会从浏览器中获得不同的处理方式。有什么想法吗?

我实际上通过使用HyperLinkBut​​ton包装导航触发UI来解决这个问题,但我还是很好奇...

1 个答案:

答案 0 :(得分:4)

我要引用一个花哨的公司报价并说“这是一个功能,而不是一个错误。”

Silverlight团队显然担心安全问题。他们不希望像你我这样疯狂的haxorz用我们的应用程序做疯狂的事情 - 你知道,就像弹出一堆浏览器窗口所有路由人到Zombo.com。想象一下合唱团吧! 宗布<!/ em>的

Summarized from their documentation:他们希望我们只使用HyperlinkBut​​ton超出他们的应用程序。事实上,他们去了extra step,根据我们的设置,如果我们导航到外部页面,他们甚至会为我们抛出一个SecurityException - 甚至来自HyperlinkBut​​ton。多好啊。

真正的问题:为什么是超链接按钮而不是其他东西?

只有一个“东西”可以导航。这样可以在测试Silverlight时为Microsoft节省时间。这一件事可以导航到内部XAML页面和外部网页 - 可能也是一致的,并且只有一种方法可以进行导航。

这是一个UIElement。它背后的代码喜欢在主要的视觉线程中运行。它可以向浏览器承诺Visual Element想要去某个地方。 Microsoft还可以将其限制逻辑放在需要鼠标单击/键盘输入事件树的控件中。

总而言之,通过让控件完成工作来开始简单是有意义的。

有趣的东西!希望这会对你有所帮助。