none
Componente de texto que identifique um link RRS feed

  • Pergunta

  • Boa tarde,

    No windows forms, nós temos o RichTextBox que possui o evento LinkCliked.

    Com qual componente posso fazer algo semelhante?

    Cleidson França

    terça-feira, 26 de outubro de 2010 18:08

Respostas

  • Tente isto:

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
          FlowDocument flowDoc = new FlowDocument();
    
          Paragraph paragrafo = new Paragraph();
          Hyperlink textLink = new Hyperlink(new Run("http://www.futurainvestimentos.com.br"));
          textLink.NavigateUri = new Uri("http://www.futurainvestimentos.com.br");
          textLink.RequestNavigate +=navHandler;
    
          paragrafo.Inlines.Add(textLink);
    
          flowDoc.Blocks.Add(paragrafo);
          rb.Document = flowDoc;
    
        }
    
        private void navHandler(object sender, RequestNavigateEventArgs e)
        {
          MessageBox.Show(e.Uri.AbsoluteUri);
        }
    

    O seu RichTextBox tem que ter as propriedades IsReadOnly e IsDocumentEnabled setadas para true

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quinta-feira, 28 de outubro de 2010 22:02

Todas as Respostas

  • Cleidson,

    Não sei se entendi direito sua dúvida, mas, o HyperLink do WPF tem um evento que é disparado quando o usuário clica no link... Portanto, se você tiver um RichTextBox que tenha um HyperLink dentro, é só assinar o evento Click dele para ter o mesmo resultado do LinkClicked do Windows Forms, não?

    Veja o XAML abaixo (lembre-se que é só um exemplo hipotético):

    <Window x:Class="WpfApplication1.Window2"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="clr-namespace:WpfApplication1"
      Title="Window2" Height="300" Width="300">
      <Grid>
        <RichTextBox IsDocumentEnabled="True">
          <FlowDocument>
            <Paragraph>
              <TextBlock>
                <Hyperlink NavigateUri="http://www.terra.com.br" Click="Hyperlink_Click" RequestNavigate="Hyperlink_RequestNavigate">Click here</Hyperlink>
              </TextBlock>
            </Paragraph>
          </FlowDocument>
        </RichTextBox>
      </Grid>
    </Window>
    
    

    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    terça-feira, 26 de outubro de 2010 19:44
    Moderador
  • Olá..

    Não..

    A questão é a seguinte:

     

    No Windows forms, eu passava um texto qualquer (desconhecido por mim, integração com a API do Twitter), daí esse evento que eu mencionei, do RichTextBox capturava os links existentes.

    Preciso de algo semelhante..

     

    Abs

    terça-feira, 26 de outubro de 2010 19:49
  • Cleidson,

    Você quer que, dado um RichTextBox já preenchido com algum texto, ao usuário clicar em qualquer um dos links desse texto, você seja notificado? Se sim, você pode adicionar um handler no RichTextBox, informando o evento Click da classe Hyperlink e um delegate... Dessa forma, toda vez que qualquer link dentro do seu RichTextBox for clicado, o evento será disparado... Seria algo como:

        public Window2()
        {
          InitializeComponent();
    
          meuRTB.AddHandler(Hyperlink.ClickEvent, new RoutedEventHandler(Hyperlink_Click)); 
        }
    
        private void Hyperlink_Click(object sender, RoutedEventArgs e)
        {
          MessageBox.Show("Hyperlink clicked");
        }
    
    

    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    terça-feira, 26 de outubro de 2010 20:11
    Moderador
  • OPa...

     

    Não funcionou não camarada... :(

     

    quarta-feira, 27 de outubro de 2010 18:53
  • Cleidson,

    Não funcionou? Pode dar maiores detalhes? Testei aqui e funcionou... Você setou a propriedade IsDocumentEnabled do seu RichTextBox como true?


    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quarta-feira, 27 de outubro de 2010 21:50
    Moderador
  • André,

     

    Segue como está meu codigo..

      public winAlertaTwitter(Futura.PopTrade.Core.VO.Trade trade) : base(trade)
        {
          InitializeComponent();
          rtbTwitter.AddHandler(Hyperlink.ClickEvent, new RoutedEventHandler(Hyperlink_Click));
        }
    
    
     private void winAlertaTwitter_Loaded(object sender, RoutedEventArgs e)
        {
          lblTwitterFutura.Content = "@" + Futura.PopTrade.Core.BLL.Config.GetInstance().ObterChave("LOGIN_TWITTER");
          
          //string link;
          //string documentText;
          //link = Futura.Commom.StringParser.stringBetween(TradeTwitter.Comentario + " ","http", " ");
          //documentText = "<html><head></head><body>"+ TradeTwitter.Comentario+"<a href='"+"http://"+link+"'"+" target='_blanck' >Acesse</a></body></html>";
          //_wbo.WebBrowser.NavigateToString(documentText);
    
          FlowDocument flowDoc = new FlowDocument();
    
          Paragraph paragrafo = new Paragraph();
          paragrafo.Inlines.Add(new Run("Testando. http://www.futurainvestimentos.com.br"));
    
          flowDoc.Blocks.Add(paragrafo);
          rtbTwitter.Document = flowDoc;
      
    
        }    <br/>
        private void Hyperlink_Click(object sender, RoutedEventArgs e)<br/>
        {<br/>
          MessageBox.Show("Hyperlink clicked");<br/>
        }
    

    quinta-feira, 28 de outubro de 2010 19:08
  • Tente isto:

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
          FlowDocument flowDoc = new FlowDocument();
    
          Paragraph paragrafo = new Paragraph();
          Hyperlink textLink = new Hyperlink(new Run("http://www.futurainvestimentos.com.br"));
          textLink.NavigateUri = new Uri("http://www.futurainvestimentos.com.br");
          textLink.RequestNavigate +=navHandler;
    
          paragrafo.Inlines.Add(textLink);
    
          flowDoc.Blocks.Add(paragrafo);
          rb.Document = flowDoc;
    
        }
    
        private void navHandler(object sender, RequestNavigateEventArgs e)
        {
          MessageBox.Show(e.Uri.AbsoluteUri);
        }
    

    O seu RichTextBox tem que ter as propriedades IsReadOnly e IsDocumentEnabled setadas para true

    Bruno


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    quinta-feira, 28 de outubro de 2010 22:02