TextBlock中的超链接不可单击

问题描述

我已经在隐藏代码中做到了:

var finishedText = new Run("Some text");
var finishedUrl = new Run("http://somewhere");

var hyperlink = new Hyperlink(finishedUrl) { NavigateUri = new Uri("http://somewhere") };

hyperlink.RequestNavigate += Hyperlink_RequestNavigate;
FinishedTextBlock.Inlines.Clear();
FinishedTextBlock.Inlines.Add(finishedText);
FinishedTextBlock.Inlines.Add(hyperlink);
FinishedTextBlock.Inlines.Add(Environment.NewLine);
FinishedTextBlock.Inlines.Add(finishedUrl);

在XAML中:

<TextBlock Grid.Row="0"
           x:Name="FinishedTextBlock"
           Width="Auto"
           Margin="10 10 0 0">
</TextBlock>

该文本不可点击。

enter image description here

我在做什么错了?

解决方法

该文本不可点击。

这是因为您的Hyperlink文字甚至都没有显示。您会看到添加到Run集合中的最后一个Inlines,而不是超链接本身。

您将名为Run的相同finishedUrl添加到Hyperlink并包含TextBlock,但是您必须为{创建一个单独的Run实例{1}}。

Hyperlink

更好的是,不要添加最后一个var finishedText = new Run("Some text"); var finishedUrl = "http://somewhere"; var finishedUrlRun = new Run(finishedUrl); var hyperlink = new Hyperlink(finishedUrlRun) { NavigateUri = new Uri("http://somewhere") }; hyperlink.RequestNavigate += Hyperlink_RequestNavigate; FinishedTextBlock.Inlines.Clear(); FinishedTextBlock.Inlines.Add(finishedText); FinishedTextBlock.Inlines.Add(hyperlink); FinishedTextBlock.Inlines.Add(Environment.NewLine); var finishedUrlRun1 = new Run(finishedUrl); FinishedTextBlock.Inlines.Add(finishedUrlRun1); ,因为它是多余的,而将Run替换为NewLine以获得与图像相同的布局,但是要使用链接。

LineBreak
,

除非您的超链接位于Web视图内,否则单击超链接时不会发生任何事情。

您需要处理RequestNavigate事件并执行某些操作,然后才能看到其中带有页面的Web浏览器。

如果这是框架或导航窗口中的wpf页面,那么它也将在没有代码的情况下导航。

https://docs.microsoft.com/en-us/dotnet/api/system.windows.documents.hyperlink?view=netcore-3.1

备注

超链接实现您设置的NavigateUri属性 与应该导航到的内容的Uri 单击超链接。只有在以下情况下才能进行超链接导航: 超级链接的直接或间接父级是导航 主机,包括NavigationWindow,Frame或任何可以承载的浏览器 XBAP(包括Internet Explorer 6和更高版本,以及 Firefox 2.0以上版本)。有关更多信息,请参见中的“导航主机”主题。 导航概述。

实际上,您需要一个事件处理程序。

我不清楚您是否打算显示URL或字符串。如果您想使用其他字符串,则应该可以:

        TextBlock tb = new TextBlock();
        tb.Inlines.Add(new Run {Text="Some text" } );
        tb.Inlines.Add(new LineBreak());
        Run linkRun = new Run("Link To Google");
        Hyperlink hyper = new Hyperlink(linkRun) { NavigateUri = new Uri(@"http://www.google.com") };
        hyper.RequestNavigate += (o,e) => Process.Start(new ProcessStartInfo(e.Uri.ToString()){ UseShellExecute = true }); 
        tb.Inlines.Add(hyper);

如果您想显示网址而不是其他字符串,则:

        TextBlock tb = new TextBlock();
        tb.Inlines.Add(new Run { Text = "Some text" });
        tb.Inlines.Add(new LineBreak());
        string url = @"http://www.google.com";
        Run linkRun = new Run(url);
        Hyperlink hyper = new Hyperlink(linkRun){ NavigateUri = new Uri(url) };
        hyper.RequestNavigate += (o,e) => Process.Start(new ProcessStartInfo(e.Uri.ToString()) { UseShellExecute = true });
        tb.Inlines.Add(hyper);
        sp.Children.Add(tb);

注意

一个进程开始,如果没有在进程startinfo中执行useshellexecute,您经常会在Win 10机器上遇到错误。

在较旧的操作系统中(您会在较旧的SO答案中看到),您以前只能处理以URL开头的代码,并且可以与默认浏览器一起使用。

有一个换行符内联,旨在在文本块中的一系列运行之间添加换行符。

,

在XAML中,它必须是这样的:

<TextBlock Grid.Row="0"
    x:Name="FinishedTextBlock"
    Width="Auto"
    Margin="10 10 0 0">
<Run Text="Some text" /> 
<LineBreak/>
<Hyperlink>http://somewhere</Hyperlink>
</TextBlock>

代码中的超链接不包含任何内容。超链接构造函数参数 [finishedUrl]没有初始化超链接以包含字符串“ http:// somewhere”。

您可以如下更改代码:

var finishedText = new Run("Some text");
var finishedUrl = new Run("http://somewhere");

var hyperlink = new Hyperlink() { NavigateUri = new Uri("http://somewhere") };
hyperlink.Inlines.Add(finishedUrl.Text);

hyperlink.RequestNavigate += Hyperlink_RequestNavigate;
FinishedTextBlock.Inlines.Clear();
FinishedTextBlock.Inlines.Add(finishedText);
FinishedTextBlock.Inlines.Add(Environment.NewLine);
FinishedTextBlock.Inlines.Add(hyperlink);