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.

Foi útil?

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 Hyperlinks dentro do RichTextBox. O essencial é usar um EventSetter para fazer as Hyperlinks 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());
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top