You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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调用。

方案2:修复NavigateUrl绑定的细节

如果更倾向用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:35:59