如何解决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>
该文本不可点击。
我在做什么错了?
解决方法
该文本不可点击。
这是因为您的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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。