3

I want to make textbox text as Hyperlink. Suppose if the type www.google.com as tetxbox text,when i click on the text ,it show open the link in a browser..

I could not get any idea to implement this...can u suggest me any idea...i tried the two ways.

way1:

  <TextBox Grid.Row="4" Name="txtWebPage" VerticalAlignment="Top" TextDecorations="UnderLine" TextChanged="txtWebPage_TextChanged" Foreground="Blue">
                                </TextBox>

way2:

 <TextBlock Name="tbWebpage" Grid.Row="4" Background="White" VerticalAlignment="Top" Height="20" >
                                    <Hyperlink></Hyperlink>
                                </TextBlock>

way3:

   <RichTextBox Grid.Row="4" Name="rtxtWeb" BorderBrush="Gray" BorderThickness="1" VerticalAlignment="Top" Height="20" IsDocumentEnabled="True" Foreground="Blue" LostFocus="rtxtWeb_LostFocus">
                                    <FlowDocument>
                                        <Paragraph>
                                            <Hyperlink NavigateUri=""/>
                                        </Paragraph>
                                    </FlowDocument>
                                </RichTextBox>

I couldnt get how can i bind the RichTextBox text to Hyperlink uri!!! There is no click event for richtextbox...any suggestion please...

2
  • You want to make text as hyperlink if it is URI of the website, yes? Commented Jul 15, 2013 at 18:41
  • Yes...thats what i want Commented Jul 16, 2013 at 2:21

1 Answer 1

13

First, I'm not sure why you'd want to do this... if the text becomes a clickable hyperlink the instant it's a valid URI, how would you continue to edit it?

The Hyperlink control doesn't do anything special for you and it can't be hosted in a TextBox. Instead, use a regular TextBox, check the text for a valid URI every time it's updated, and apply a style to make the text look like a clickable link.

<TextBox TextChanged="TextBox_TextChanged" MouseDoubleClick="TextBox_MouseDoubleClick">
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding HasValidURI}" Value="True">
                    <Setter Property="TextDecorations" Value="Underline"/>
                    <Setter Property="Foreground" Value="#FF2A6DCD"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

Every time the text is changed, TextBox_TextChanged is called. This checks whether the text is a valid URI using Uri.TryCreate(). If so, a property HasValidURI is set to true. A DataTrigger in the TextBox's style picks this up and makes the text underlined and blue.

Making the hyperlink immediately clickable would cause you not to be able to position the cursor, so I watch for a double-click instead. When one is received, convert the text to a URI again and kick off a Process with that URI.

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private bool _hasValidURI;

    public bool HasValidURI
    {
        get { return _hasValidURI; }
        set { _hasValidURI = value; OnPropertyChanged( "HasValidURI" ); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged( string name )
    {
        var handler = PropertyChanged;
        if( handler != null ) handler( this, new PropertyChangedEventArgs( name ) );
    }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    private void TextBox_TextChanged( object sender, TextChangedEventArgs e )
    {
        Uri uri;
        HasValidURI = Uri.TryCreate( (sender as TextBox).Text, UriKind.Absolute, out uri );
    }

    private void TextBox_MouseDoubleClick( object sender, MouseButtonEventArgs e )
    {
        Uri uri;
        if( Uri.TryCreate( (sender as TextBox).Text, UriKind.Absolute, out uri ) )
        {
            Process.Start( new ProcessStartInfo( uri.AbsoluteUri ) );
        }
    }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.