Texto c# wpf com links
-
26-09-2019 - |
Pergunta
Acabei de me encontrar um novo desafio: faça um processador de texto que está lidando mais com a web do que o texto simples. Projetar uma boa estrutura para isso é o que eu mal posso esperar para começar, mas preciso saber quais são as possibilidades do lado da GUI (provavelmente terá muitos desafios da GUI).
Portanto, a coisa básica que eu preciso de algum tipo de controle, onde posso tornar as partes do meu texto cliques de texto / mouse-over-inable.
Eu sou meio novo no WPF e não tenho certeza de como fazer isso. Alguém tem uma ideia de como fazer isso? Existem exemplos? Já existem controles para isso?
desde já, obrigado
EDITAR:
Descobri uma maneira de fazer isso com uma caixa richtext:
// Create a FlowDocument to contain content for the RichTextBox.
FlowDocument myFlowDoc = new FlowDocument();
// Add paragraphs to the FlowDocument.
Hyperlink myLink = new Hyperlink();
myLink.Inlines.Add("hyperlink");
myLink.NavigateUri = new Uri("http://www.stackoverflow.com");
// Create a paragraph and add the Run and hyperlink to it.
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add("check this link out: ");
myParagraph.Inlines.Add(myLink);
myFlowDoc.Blocks.Add(myParagraph);
// Add initial content to the RichTextBox.
richTextBox1.Document = myFlowDoc;
Agora recebo um belo hiperlink na minha caixa de texto ... exceto quando clico nela, nada acontece. O que estou perdendo aqui?
Solução
Você pode usar o Hiperlink classe. É um quadro -contencioso, para que você possa usá -lo em um bloco de texto ou um documento de fluxo ou em qualquer outro lugar em que você possa incorporar conteúdo.
<TextBlock>
<Run>Text</Run>
<Hyperlink NavigateUri="http://stackoverflow.com">with</Hyperlink>
<Run>some</Run>
<Hyperlink NavigateUri="http://google.com">hyperlinks</Hyperlink>
</TextBlock>
Você pode querer olhar para usar um RichTextBox Como parte do seu editor. Isso hospedará um documento de fluxo, que pode conter conteúdo como hiperlinks.
ATUALIZAÇÃO: Existem duas maneiras de lidar com os cliques no hiperlink. Um é lidar com o Requestnavigate evento. É um Evento roteado, para que você possa anexar um manipulador ao próprio hiperlink ou pode anexar um a um elemento mais alto na árvore, como a janela ou a caixa richtext:
// On a specific Hyperlink
myLink.RequestNavigate +=
new RequestNavigateEventHandler(RequestNavigateHandler);
// To handle all Hyperlinks in the RichTextBox
richTextBox1.AddHandler(Hyperlink.RequestNavigateEvent,
new RequestNavigateEventHandler(RequestNavigateHandler));
A outra maneira é usar comandante Configurando o Comando propriedade no hiperlink para um Eu mando implementação. O método executado no iCommand será chamado quando o hiperlink for clicado.
Se você quiser lançar um navegador no manipulador, pode passar o URI para Process.start:
private void RequestNavigateHandler(object sender, RequestNavigateEventArgs e)
{
Process.Start(e.Uri.ToString());
}
Outras dicas
Observe que você também precisa definir as seguintes propriedades no seu RichTextBox ou os hiperlinks serão desativados e não dispararão eventos. Sem o isreadonly, você precisa clicar com o clique com os hiperlinks, com o isreadonly eles disparam com um clique esquerdo regular.
<RichTextBox
IsDocumentEnabled="True"
IsReadOnly="True">
A maneira mais simples é lidar com o evento RequestNavigate como este:
...
myLink.RequestNavigate += HandleRequestNavigate;
...
private void HandleRequestNavigate(object sender, RoutedEventArgs e)
{
var link = (Hyperlink)sender;
var uri = link.NavigateUri.ToString();
Process.Start(uri);
e.Handled = true;
}
Existem alguns problemas ao iniciar um navegador padrão passando o URL para o processo.