23

在我的 C# 独立应用程序中,我想让用户单击可以启动他们喜欢的浏览器的链接。

System.Windows.Controls.TextBlock text = new TextBlock();
Run run = new Run("Link Text");

Hyperlink link = new Hyperlink(run);
link.NavigateUri = new Uri("http://w3.org");
text.Inlines.Add(link);

链接显示正确。

当我将鼠标移到它上面时,链接变为红色。

问题:当我点击它时,什么也没有发生。

我是不是忘记了什么?我是否需要实现某种方法才能真正让链接打开?

4

4 回答 4

30

您需要处理超链接的RequestNavigate事件。这是一个快速的方法:

link.RequestNavigate += (sender, e) =>
{
    System.Diagnostics.Process.Start(e.Uri.ToString());
};
于 2012-10-05T08:59:48.107 回答
6

您正在处理“Hyperlink.RequestNavigate”事件吗?当用户在 WPF 窗口中单击超链接时,它不会自动打开具有在其 NavigateUri 属性中指定的 URI 的浏览器。

在您的代码隐藏中,您可以执行以下操作:

link.RequestNavigate += LinkOnRequestNavigate;

private void LinkOnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
    System.Diagnostics.Process.Start(e.Uri.ToString());
}
于 2012-10-05T09:01:35.083 回答
2

您可以在 App.xaml.cs 中创建一个全局超链接处理程序

protected override void OnStartup(StartupEventArgs e) {
    EventManager.RegisterClassHandler(
        typeof(System.Windows.Documents.Hyperlink),
        System.Windows.Documents.Hyperlink.RequestNavigateEvent,
        new System.Windows.Navigation.RequestNavigateEventHandler(
            (sender, en) => Process.Start(new ProcessStartInfo(
                en.Uri.ToString()
            ) { UseShellExecute = true })
        )
    );
    base.OnStartup(e);
}

这假定所有 NavigateUri 属性都引用您要启动的内容,但您始终可以让处理程序处理边缘情况。

于 2021-03-04T15:19:47.140 回答
1

对于 .Net Core 中的用户,您执行此操作的方式已经改变。基于这个答案这个

link.RequestNavigate += (sender, e) =>
{
    var url = e.Uri.ToString();
    Process.Start(new ProcessStartInfo(url)
    { 
        UseShellExecute = true 
    });
};
于 2021-04-16T21:57:06.657 回答