单击RichTextBox中的HyperLinks而不按住CTRL - WPF

Joh*_*nan 12 wpf click richtextbox hyperlink ctrl

我有一个WPF RichTextBox isReadOnly设置为True.我希望用户能够点击RichTextBox中包含的HyperLink,而不必按住它们Ctrl.

HyperLink上的Click事件似乎没有触发,除非Ctrl被按下,所以我不确定如何继续.

JHu*_*d80 24

我找到了解决方案.将IsDocumentEnabled设置为"True"并将IsReadOnly设置为"True".

<RichTextBox IsReadOnly="True" IsDocumentEnabled="True" />
Run Code Online (Sandbox Code Playgroud)

一旦我这样做,当我将鼠标悬停在HyperLink标签内显示的文本上时,鼠标将变为"手".单击而不保持控件将触发"Click"事件.

我正在使用.NET 4中的WPF.我不知道.NET的早期版本是否不像我上面描述的那样起作用.

  • 这具有使复制和粘贴目的无法选择文本的不可取的副作用. (6认同)

hil*_*lin 13

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

但是我需要:P这是我的方法:为Hyperlinks里面设置一个样式RichTextBox.必不可少的是使用a EventSetterHyperlink处理MouseLeftButtonDown事件.

<RichTextBox>
    <RichTextBox.Resources>
        <Style TargetType="Hyperlink">
            <Setter Property="Cursor" Value="Hand" />
            <EventSetter Event="MouseLeftButtonDown" Handler="Hyperlink_MouseLeftButtonDown" />
        </Style>
    </RichTextBox.Resources>
</RichTextBox>
Run Code Online (Sandbox Code Playgroud)

在代码隐藏中:

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

感谢gcores的鼓舞人心.


Joh*_*nan 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;
Run Code Online (Sandbox Code Playgroud)

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