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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top