This is a migrated thread and some comments may be shown as answers.

RadRichTextBox.InsertHyperlink

3 Answers 100 Views
RichTextBox
This is a migrated thread and some comments may be shown as answers.
Jose
Top achievements
Rank 1
Jose asked on 18 Jun 2013, 11:24 PM
Hi, telerik guys!

I want to change the Hyperlink Style when I use the RadRichTextBox.InsertHyperlink method, I've created a custom style (see code below) and passed as a parameter to this method instead of the CurrentEditingStyle, but still the text is shown in color blue and underlined, there's any way to change this style and show an specific hyperlink with a custom style? Thanks in advance for the help.

Example Code:
Telerik.Windows.Documents.Model.Styles.StyleDefinition mergeFieldStyle = new Telerik.Windows.Documents.Model.Styles.StyleDefinition();
mergeFieldStyle.BasedOn = radRichTextBox.DefaultStyleSettings.BasedOn;
mergeFieldStyle.BasedOnName = radRichTextBox.DefaultStyleSettings.BasedOnName;
mergeFieldStyle.Type = radRichTextBox.DefaultStyleSettings.Type;
mergeFieldStyle.DisplayName = "MergeFieldStyle";
mergeFieldStyle.Name = "MergeFieldStyle";
mergeFieldStyle.SetPropertyValue(Telerik.Windows.Documents.Model.Span.ForeColorProperty, Colors.Red);
mergeFieldStyle.SetPropertyValue(Telerik.Windows.Documents.Model.Span.UnderlineDecorationProperty, Telerik.Windows.Documents.UI.TextDecorations.DecorationProviders.UnderlineTypes.None);

radRichTextBox.Document.StyleRepository.Add(mergeFieldStyle);
radRichTextBox.InsertHyperlink(mergeField, string.Format("[{0}]", caption), mergeFieldStyle);

I've also try to change the SpanProperties in the CurrentEditingStyle and passing them to the method,  with my custom style properties but no success either.


3 Answers, 1 is accepted

Sort by
0
Deyan
Telerik team
answered on 21 Jun 2013, 12:04 PM
Hello Jose,

Thank you for contacting us about this issue!

The overload of InsertHyperlink method taking a StyleDefinition as third argument is now obsolete, so the parameter hyperlinkStyle is not used and the default document hyperlink style will be used instead. That is why in your case you will have to select the inserted hyperlink and set a new style to it. Here is a sample code how this can be done:

First, you will have to create your style, similarly to your sample code snippet. The only difference is that I'd suggest you use the constructor for StyleDefinition taking StyleType.Character as an argument which is appropriate for applying on hyperlinks.

StyleDefinition mergeFieldStyle = new StyleDefinition(StyleType.Character);
 
            mergeFieldStyle.BasedOn = this.radRichTextBox.DefaultStyleSettings.BasedOn;
            mergeFieldStyle.BasedOnName = this.radRichTextBox.DefaultStyleSettings.BasedOnName;
 
            mergeFieldStyle.DisplayName = "MergeFieldStyle";
            mergeFieldStyle.Name = "MergeFieldStyle";
            mergeFieldStyle.SetPropertyValue(Telerik.Windows.Documents.Model.Span.ForeColorProperty, Colors.Red);
            mergeFieldStyle.SetPropertyValue(Telerik.Windows.Documents.Model.Span.UnderlineDecorationProperty,
                Telerik.Windows.Documents.UI.TextDecorations.DecorationProviders.UnderlineTypes.None);
 
            radRichTextBox.Document.StyleRepository.Add(mergeFieldStyle);

The next step is to insert the desired hyperlink and after the insertion, select it and change its style with the already predefined custom style. You may notice that in the following sample code all operations are surrounded by BeginUndoGroup and EndUndoGroup methods so that you can reverse the insertion and the change of style property in a single Undo step.
this.radRichTextBox.BeginUndoGroup();
 
            this.radRichTextBox.InsertHyperlink(new HyperlinkInfo() { Target = HyperlinkTargets.Blank, NavigateUri = "http://www.telerik.com" }, "Telerik link");
 
            DocumentPosition documentPosition = new DocumentPosition(this.radRichTextBox.Document.CaretPosition);
            documentPosition.MoveToPrevious();
            var rangeStart = this.radRichTextBox.Document.GetContainingAnnotationRanges<HyperlinkRangeStart>(documentPosition.GetCurrentInline(), true).First();
 
            this.radRichTextBox.Document.Selection.SelectAnnotationRange(rangeStart);
            this.radRichTextBox.ChangeStyleName("MergeFieldStyle");
 
            this.radRichTextBox.EndUndoGroup();

If you still have any concerns about this or face any other issue do not hesitate to contact us again!

Regards,
Deyan
the Telerik team

Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

0
Kushagra
Top achievements
Rank 1
answered on 17 Feb 2014, 09:08 AM
How would we change the style if the Selection is multiline in which case the Hyperlink extends to may be a table or span etc. Especially in the case when the text is inside a table this.radRichTextBox.Document.GetContainingAnnotationRanges<HyperlinkRangeStart>(documentPosition.GetCurrentInline(), true).Count() comes to 0. Any workarounds regarding this?

Warm Regards,
Kushagra
0
Mihail
Telerik team
answered on 20 Feb 2014, 01:14 PM
Hello Kushagra,

 I will try to explain in details what are the most important steps in order to change the style of hyperlink.

First and most important thing is to get inline which is inside a hyperlink. Such inlines are the hyperlink start and end range, and all the spans that are containing the text of the hyperlink. You can do that by navigating a document position to the required inline. Here is example on how to do that:
DocumentPosition documentPosition = new DocumentPosition(this.radRichTextBox.Document.CaretPosition);
documentPosition.MoveToPrevious();
There are many convenient methods inside DocumentPosition to navigate around the document. I can recommend you to check them.

Once you have the required inline you may apply the style to the hyperlink as Deyan already showed. Here is the code sample on how to do it:
var rangeStart = this.radRichTextBox.Document.GetContainingAnnotationRanges<HyperlinkRangeStart>(inline, true).First();
this.radRichTextBox.Document.Selection.SelectAnnotationRange(rangeStart);
 
this.radRichTextBox.ChangeStyleName("MergeFieldStyle");

If you need to apply this style to all hyperlinks in a document you can do that by iterating over all HyperlinkRangeStart in the document and get the inline from them. Here is code sample on how to do it:
foreach (var hyperlinkRangeStart in this.radRichTextBox.Document.EnumerateChildrenOfType<HyperlinkRangeStart>())
{
    var rangeStart = this.radRichTextBox.Document.GetContainingAnnotationRanges<HyperlinkRangeStart>(hyperlinkRangeStart, true).First();
    this.radRichTextBox.Document.Selection.SelectAnnotationRange(rangeStart);
 
    this.radRichTextBox.ChangeStyleName("MergeFieldStyle");
}

In case you need to apply the new hyperlink style only to specific hyperlink you can do that by iterate over all HyperlinkRangeStart elements and depending on the information in the hyperlink to apply the style on the hyperlink you want.

Regarding the case when the hyperlink is inside a table or on multiline, just move the document position to the hyperlink and get the inline needed to apply the style.

Please do not forget to Begin and End the undo group if you need to be able to revert those changes in the document using the undo command.

I hope this information answers your questions. If you have further questions or comments feel free to contact us again,

Regards,
Mihail
Telerik
Tags
RichTextBox
Asked by
Jose
Top achievements
Rank 1
Answers by
Deyan
Telerik team
Kushagra
Top achievements
Rank 1
Mihail
Telerik team
Share this question
or