diff --git a/knowledge-base/chat-intercept-html-links.md b/knowledge-base/chat-intercept-html-links.md new file mode 100644 index 000000000..18d9f267a --- /dev/null +++ b/knowledge-base/chat-intercept-html-links.md @@ -0,0 +1,99 @@ +--- +title: Intercepting HTML Link Click in RadChat Control +description: Learn how to intercept when HTML links are clicked in the RadChat control in UI for WinForms +type: how-to +page_title: Intercepting HTML Link Click in RadChat Control +meta_title: Intercepting HTML Link Click in RadChat Control +slug: chat-intercept-html-links +tags: chat, radchat, link interception, html links, click events +res_type: kb +ticketid: 1701502 +--- + +|Product Version|Product|Author| +|----|----|----| +|2025.3.812|RadChat for WinForms|[Dinko Krastev](https://www.telerik.com/blogs/author/dinko-krastev)| + +## Description + +At the moment of writing this Knowledge Base article, the RadChat control does not expose such an event that will be triggered when a hyperlink is clicked. We can use a custom code to catch the moment when the user clicks a link before it is actually opened in the browser. + +## Solution + +To intercept HTML links in RadChat, subclass the control and override its `OnMouseDown` method. Check if the clicked element is a hyperlink, then handle it accordingly. + +### Steps to Implement +1. Create a custom class inheriting from `RadChat`. +2. Override the `OnMouseDown` method to detect clicked links. +3. Use `ElementTree.GetElementAtPoint` to identify the element under the mouse. +4. Implement a helper method to verify if the mouse is over a link. +5. Replace the default RadChat control with the customized one in your `Form.Designer.cs` file. + +### Example Code +Below is the complete implementation: + +````C# + +public class MyRadChat : RadChat +{ + protected override void OnMouseDown(MouseEventArgs e) + { + var element = this.ElementTree.GetElementAtPoint(e.Location); + if (element != null && element is ChatMessageBubbleElement chatMessageBubbleElement) + { + string[] numLines = chatMessageBubbleElement.Text.Split('\n'); + + FormattedText formattedTextLink = IsMouseOverBlock(element, e, chatMessageBubbleElement.TextBlock.Lines); + if (formattedTextLink != null) + { + var link = formattedTextLink.Link; + return; + } + else + { + base.OnMouseDown(e); + } + } + base.OnMouseDown(e); + } + + FormattedText IsMouseOverBlock(object sender, MouseEventArgs e, List lines) + { + RadElement element = sender as RadElement; + Debug.Assert(element != null, "Element is not RadElement"); + Point elementAtPoint = element.PointFromControl(e.Location); + int linesCount = lines.Count(); + for (int i = 0; i < linesCount; ++i) + { + TextLine textLine = lines[i]; + int textLineCount = textLine.List.Count; + for (int j = 0; j < textLineCount; ++j) + { + FormattedText formattedText = textLine.List[j]; + if (!string.IsNullOrEmpty(formattedText.Link) && formattedText.DrawingRectangle.Contains(elementAtPoint)) + { + return formattedText;//found link under mouse + } + } + } + + return null;//notfound + } + public override string ThemeClassName + { + get + { + return typeof(RadChat).FullName; + } + } +} + +```` + +With this subclass, you can intercept links and customize their behavior, such as downloading content or displaying it in a custom viewer. + +## See Also + +* [RadChat Overview](https://docs.telerik.com/devtools/winforms/controls/chat/overview) +* [HTML-like Text Formatting](https://docs.telerik.com/devtools/winforms/telerik-presentation-framework/html-like-text-formatting) +