Ao clicar em hiperlinks em um RichTextBox sem pressionar CTRL - WPF
-
11-09-2019 - |
Pergunta
Eu tenho um WPF RichTextBox com o conjunto isReadOnly
para True
. Eu gostaria que os usuários possam clicar em HyperLinks contido dentro do RichTextBox, sem que tenham de manter pressionada Ctrl .
O evento clicar no link não parece fogo a menos que Ctrl é realizada para baixo, então eu não tenho certeza de como proceder.
Solução 3
conseguiu encontrar uma maneira de contornar isso, praticamente por acidente.
O conteúdo que é carregado no meu RichTextBox é apenas armazenada (ou digitada) como uma cadeia simples. Eu tenho uma subclasse do RichTextBox para permitir a ligação contra ela de propriedade de documentos.
O que é relevante para a questão, é que eu tenho um Convert IValueConverter (sobrecarga), que é algo como isto (código não-essencial para a solução tem sido retirados):
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;
Isto torna-se-me o comportamento que eu quero (empurrando cordas simples em RichTextBox e recebendo formatação) e também resulta em vínculos que se comportam como uma ligação normal, em vez de um que está incorporado em um documento do Word.
Outras dicas
Eu encontrei uma solução. Set IsDocumentEnabled para "True" e definir IsReadOnly para "True".
<RichTextBox IsReadOnly="True" IsDocumentEnabled="True" />
Uma vez eu fiz isso, o mouse se transformaria em uma 'mão' quando eu passar o mouse sobre um texto exibido dentro de uma marca de hiperlink. Clicando sem segurando o controle dispara o evento 'click'.
Eu estou usando WPF de .NET 4. Eu não sei se versões anteriores do .NET não funcionam como eu descrevi acima.
JHubbard80 's resposta é uma solução possível, é a maneira mais fácil se você não precisa o conteúdo a ser selecionado .
No entanto eu preciso que: P aqui é a minha abordagem: definir um estilo para os Hyperlink
s dentro do RichTextBox
. O essencial é usar um EventSetter
para fazer as Hyperlink
s manipular o evento MouseLeftButtonDown
.
<RichTextBox>
<RichTextBox.Resources>
<Style TargetType="Hyperlink">
<Setter Property="Cursor" Value="Hand" />
<EventSetter Event="MouseLeftButtonDown" Handler="Hyperlink_MouseLeftButtonDown" />
</Style>
</RichTextBox.Resources>
</RichTextBox>
E em codebehind:
private void Hyperlink_MouseLeftButtonDown(object sender, MouseEventArgs e)
{
var hyperlink = (Hyperlink)sender;
Process.Start(hyperlink.NavigateUri.ToString());
}
Graças à gcores para o inspiaration.
Você já tentou manipular o evento MouseLeftButtonDown em vez do evento Click?
Eu mudei EventSetter de resposta de @ Hillin. MouseLeftButtonDown não funcionou no meu código (NET Framework 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());
}