2009-04-17 37 views
9

我有一个WPF RichTextBox,其中isReadOnly设置为True。我希望用户能够点击RichTextBox中包含的超链接,而不必按住Ctrl在按住CTRL的情况下单击RichTextBox中的超链接 - WPF

HyperLink上的Click事件似乎不会触发,除非Ctrl被限制,所以我不确定如何继续。

+2

已经感谢Skeet了?非常棘手! – Anthony 2009-04-17 21:32:38

+0

@Anthony,这是一个签名(查看拼写) – JaredPar 2009-04-17 21:34:39

+1

Hehehe,我其实是John,但是如果Skeet来了,我一定会感谢他:) – 2009-04-17 22:10:19

回答

3

设法找到解决方法,几乎​​是偶然。

加载到我的RichTextBox中的内容仅作为普通字符串存储(或输入)。我已经将RichTextBox子类化为允许绑定它的Document属性。

有什么相关的问题是,我有一个的IValueConverter转换()重载,看起来像这样(代码非必要的解决方案已被剥离出来):

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文档中的链接。

+0

var textSplit在哪里以​​及如何创建? – 2015-01-27 17:52:00

0

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

17

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

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

一旦我这样做了,当我将鼠标悬停在HyperLink标签中显示的文本上时,鼠标就会变成“手”。点击没有控制将触发'点击'事件。

我使用.NET 4中的WPF。我不知道早期版本的.NET是否无法正常工作,如上所述。

10

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

但是我需要:P这里是我的方法:为RichTextBox中的Hyperlink s设置样式。必要的是使用EventSetter来使Hyperlink处理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为inspiaration。