在我的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);
链接显示正确。
当我将鼠标移到它上面时,链接变为红色。
问题:当我点击它时,没有任何反应。
我忘了什么吗?我是否需要实现某种方法才能真正打开链接?
答案 0 :(得分:25)
您需要处理超链接的RequestNavigate
事件。这是一个快速的方法:
link.RequestNavigate += (sender, e) =>
{
System.Diagnostics.Process.Start(e.Uri.ToString());
};
答案 1 :(得分:6)
您是否正在处理'Hyperlink.RequestNavigate'事件?当用户在WPF窗口中单击超链接时,它不会自动打开具有其NavigateUri属性中指定的URI的浏览器。
在您的代码隐藏中,您可以执行以下操作:
link.RequestNavigate += LinkOnRequestNavigate;
private void LinkOnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
System.Diagnostics.Process.Start(e.Uri.ToString());
}
答案 2 :(得分:1)
对于 .Net Core 中的用户,您执行此操作的方式已经改变。基于此 answer 和 this。
link.RequestNavigate += (sender, e) =>
{
var url = e.Uri.ToString();
Process.Start(new ProcessStartInfo(url)
{
UseShellExecute = true
});
};
答案 3 :(得分:0)
您可以在 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) => System.Diagnostics.Process.Start(en.Uri.ToString())
)
);
base.OnStartup(e);
}
这假设所有 NavigateUri 属性都指向您要启动的内容,但您始终可以让处理程序处理边缘情况。