【问题标题】:Clicking HyperLinks in a RichTextBox without holding down CTRL - WPF在不按住 CTRL 的情况下单击 RichTextBox 中的超链接 - WPF
【发布时间】:2010-10-20 05:19:50
【问题描述】:

我有一个 WPF RichTextBox,其中 isReadOnly 设置为 True。我希望用户能够单击 RichTextBox 中包含的超链接,而无需按住 Ctrl。

除非按住 Ctrl,否则 HyperLink 上的 Click 事件似乎不会触发,所以我不确定如何继续。

【问题讨论】:

  • 已经感谢 Skeet 了吗?非常棘手!
  • @Anthony,这是一个签名(看拼写)
  • 呵呵呵呵,我其实是约翰,不过如果飞碟过来,我一定会感谢他的:)

标签: wpf richtextbox click hyperlink ctrl


【解决方案1】:

如果你想把箭头变成手形光标总是没有默认系统导航,下面是方法。

<RichTextBox>
            <RichTextBox.Resources>
                <Style TargetType="{x:Type Hyperlink}">                                
                    <EventSetter Event="MouseEnter" Handler="Hyperlink_OnMouseEnter"/>
                </Style>                
            </RichTextBox.Resources>
</RichTextBox>


private void Hyperlink_OnMouseEnter(object sender, MouseEventArgs e)
        {
            var hyperlink = (Hyperlink)sender;
            hyperlink.ForceCursor = true;
            hyperlink.Cursor = Cursors.Hand;
        }

【讨论】:

    【解决方案2】:

    我从@hillin 的回答中更改了 EventSetter。 MouseLeftButtonDown 在我的代码中不起作用(.Net 框架 4.5.2)。

    <EventSetter Event="RequestNavigate" Handler="Hyperlink_RequestNavigate" />
    
    private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
    {
        Process.Start(e.Uri.ToString());
    }
    

    【讨论】:

      【解决方案3】:

      JHubbard80的回答是一个可能的解决方案,如果您不需要选择内容,这是最简单的方法。

      但是我需要:P 这是我的方法:为RichTextBox 中的Hyperlinks 设置样式。关键是使用EventSetter 使Hyperlinks 处理MouseLeftButtonDown 事件。

      <RichTextBox>
          <RichTextBox.Resources>
              <Style TargetType="Hyperlink">
                  <Setter Property="Cursor" Value="Hand" />
                  <EventSetter Event="MouseLeftButtonDown" Handler="Hyperlink_MouseLeftButtonDown" />
              </Style>
          </RichTextBox.Resources>
      </RichTextBox>
      

      在代码隐藏中:

      private void Hyperlink_MouseLeftButtonDown(object sender, MouseEventArgs e)
      {
          var hyperlink = (Hyperlink)sender;
          Process.Start(hyperlink.NavigateUri.ToString());
      }
      

      感谢gcores 的启发。

      【讨论】:

      • 我不明白,但无论如何。它可以工作,甚至更好,让我可以访问超链接的导航代码 - 因此,如果目录不存在,我的应用程序不会崩溃!
      • 处理点击事件对我有用。它可能是 Windows 10 / WPF 4.5 的东西,但它确实有效。谢谢。
      【解决方案4】:

      我找到了解决方案。将 IsDocumentEnabled 设置为“True”,并将 IsReadOnly 设置为“True”。

      <RichTextBox IsReadOnly="True" IsDocumentEnabled="True" />
      

      一旦我这样做了,当我将鼠标悬停在超链接标签中显示的文本上时,鼠标就会变成“手”。在不控制的情况下单击将触发“单击”事件。

      我正在使用 .NET 4 的 WPF。我不知道早期版本的 .NET 是否不能像我上面描述的那样运行。

      【讨论】:

      • 这具有使文本无法选择以进行复制和粘贴的不幸副作用。
      • 澄清发生了什么:必须启用文档才能单击超链接,并且默认为禁用。但如果它不是只读的,你必须按住控制键让它引发事件,因为如果你被允许编辑文本,你不想意外导航。此行为与编辑文档时的 MS Word 相同:在只读模式下,您只需单击 URL,但在编辑时您必须按住 control 键。
      【解决方案5】:

      设法找到解决这个问题的方法,几乎​​是偶然的。

      加载到我的 RichTextBox 中的内容只是作为纯字符串存储(或输入)。我对 RichTextBox 进行了子类化,以允许绑定它的 Document 属性。

      与问题相关的是,我有一个看起来像这样的 IValueConverter Convert() 重载(对解决方案不重要的代码已被删除):

      FlowDocument doc = new FlowDocument();
      Paragraph graph = new Paragraph();
      
      Hyperlink textLink = new Hyperlink(new Run(textSplit));
      textLink.NavigateUri = new Uri(textSplit);
      textLink.RequestNavigate += 
        new System.Windows.Navigation.RequestNavigateEventHandler(navHandler);
      
      graph.Inlines.Add(textLink);
      graph.Inlines.Add(new Run(nonLinkStrings));
      
      doc.Blocks.Add(graph);
      
      return doc;
      

      这让我得到了我想要的行为(将纯字符串推入 RichTextBox 并获取格式),它还导致链接的行为类似于普通链接,而不是嵌入在 Word 文档中的链接。

      【讨论】:

      • var textSplit 是在哪里以及如何创建的?
      【解决方案6】:

      您是否尝试过处理 MouseLeftButtonDown 事件而不是 Click 事件?

      【讨论】:

        猜你喜欢
        • 2017-07-01
        • 2013-05-06
        • 1970-01-01
        • 2020-07-20
        • 1970-01-01
        • 2018-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多