【问题标题】:Hyperlink in TextBlock is is not clickableTextBlock 中的超链接不可点击
【发布时间】:2020-12-04 03:21:28
【问题描述】:

我在代码隐藏中做了这个:

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>

文本不可点击。

我做错了什么?

【问题讨论】:

  • 我对 WPF 不熟悉,但this documentation 将它包装在一个段落中。我不知道这是否会有所不同。
  • 设置超链接url的属性不是NavigateUrl吗?

标签: c# wpf xaml hyperlink


【解决方案1】:

文本不可点击。

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

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

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 以获得与图像中相同的布局,但带有链接。

FinishedTextBlock.Inlines.Clear();
FinishedTextBlock.Inlines.Add(finishedText);
FinishedTextBlock.Inlines.Add(new LineBreak());
FinishedTextBlock.Inlines.Add(hyperlink);

【讨论】:

    【解决方案2】:

    除非您的超链接在 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 和更高版本,以及 火狐 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);
    

    如果您希望显示 url 而不是其他字符串,那么:

            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);
    

    注意

    一个进程启动,在进程启动信息中没有useshellexecute的win 10机器上,你经常会得到一个错误。

    在较旧的操作系统中(您会在旧的 SO 答案中看到),您过去只能处理从 URL 开始的处理,并且可以使用默认浏览器。

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

    【讨论】:

      【解决方案3】:

      在 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);   
      

      【讨论】:

        猜你喜欢
        • 2018-11-07
        • 2016-04-20
        • 1970-01-01
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-18
        • 2010-10-26
        相关资源
        最近更新 更多