HyperlinkButton的NavigateUri及C#点击事件在Safari中失效问题求助
我之前在Silverlight项目里也踩过HyperLinkButton在Safari下失效的坑,给你几个亲测有效的解决方案:
方案1:通过JavaScript间接打开新窗口
Safari对Silverlight直接调用HtmlPage.Window.Navigate有严格的安全拦截机制,哪怕是用户点击触发的操作也可能被判定为“非用户主动发起”。改用JavaScript调用的方式就能绕过这个限制:
首先替换你的C#点击事件代码:
void btnViewURL_Click(object sender, RoutedEventArgs e) { if (!string.IsNullOrWhiteSpace(viewURL) && this.decisionViewModel.IsURLValid(viewURL)) { // 调用宿主页面的JS函数打开窗口 System.Windows.Browser.HtmlPage.Window.Invoke("openExternalLink", viewURL); } }
然后在你的Silverlight宿主页面(比如.aspx或.html)里添加这段JavaScript:
function openExternalLink(url) { window.open(url, "_blank"); }
这个方法本质是让浏览器认可的JS来发起窗口打开操作,Safari不会拦截用户点击触发的JS调用。
如果更倾向用XAML的NavigateUrl绑定,要排查这几个细节:
- 绑定的
viewURL必须是完整的绝对URL(比如https://example.com,不能只写example.com) - 必须显式设置
TargetName="_blank",否则Safari可能在当前窗口打开(甚至被拦截) - 可以给绑定加个字符串格式化,避免Silverlight在Safari下的URL解析bug:
<HyperlinkButton Content="查看链接" TargetName="_blank" NavigateUrl="{Binding viewURL, StringFormat='{}{0}'}"/>
额外注意事项
- 提醒用户检查Safari的弹出窗口阻止设置,临时关闭测试是否有效
- 如果你的Silverlight应用嵌套在iframe中,需要给iframe添加
allow-popups属性(针对新版Safari),否则即使是JS调用也会被拦截
内容的提问来源于stack exchange,提问作者user3499880
相关产品推荐
相关产品推荐

