/// <summary> /// <see cref="IContentHost.GetRectangles"/> /// </summary> ReadOnlyCollection <Rect> IContentHost.GetRectangles(ContentElement child) { IContentHost host = _owner.Target as IContentHost; if (host != null) { return(host.GetRectangles(child)); } return(new ReadOnlyCollection <Rect>(new List <Rect>(0))); }
/// <summary> /// Gets a set of rectangles suitable for highlighting a TextRange /// </summary> /// <param name="range">Range to obtain highlight rects for</param> /// <param name="contentHost">Optional IContent host used to performance</param> /// <returns>A set of rectangles suitable for highlighting a TextRange</returns> public static IEnumerable <Rect> GetHighlightRectanglesWithContentHost( TextRange range, Func <TextRange, IEnumerable <Rect> > getRectanglesCore, IContentHost contentHost ) { if (getRectanglesCore == null) { throw new ArgumentNullException("getRectanglesCore"); } IEnumerable <Rect> result; if (contentHost == null) { result = getRectanglesCore(range); } else { result = new Rect[] { }; const LogicalDirection fwd = LogicalDirection.Forward; TextPointer current = range.Start; TextElement te = current.GetAdjacentElement(fwd) as TextElement; while (te != null && te.ContentEnd.CompareTo(range.End) >= 0) { if (current.CompareTo(te.ElementStart) < 0) { TextRange leadingRange = new TextRange(current, te.ElementStart); IEnumerable <Rect> leadingRects = getRectanglesCore(leadingRange); result = result.Concat(leadingRects); current = te.ElementStart; } if (contentHost != null) { result = result.Concat(contentHost.GetRectangles(te)); } current = te.ElementEnd; te = current.GetAdjacentElement(fwd) as TextElement; } TextRange trailingRange = new TextRange(current, range.End); IEnumerable <Rect> trailingRects = getRectanglesCore(trailingRange); result = result.Concat(trailingRects); } return(result); }
private void SerializeLinkTargetForElement(IInputElement element, IContentHost contentHost, Visual root) { if (element is FrameworkElement) { FrameworkElement fe = (FrameworkElement)element; string id = fe.Name; if (!String.IsNullOrEmpty(id)) { // No need to add overlapping path element for named FE element. AddLinkTarget(id); } } else if (element is FrameworkContentElement && contentHost != null) { FrameworkContentElement fce = (FrameworkContentElement)element; string id = fce.Name; Uri uri = null; if (element is Hyperlink) { uri = ((Hyperlink)element).NavigateUri; } if (!String.IsNullOrEmpty(id) || uri != null) { Transform transform = Transform.Identity; Visual contentVisual = contentHost as Visual; if (contentVisual != null && root != null && root.IsAncestorOf(contentVisual)) { GeneralTransform t = contentVisual.TransformToAncestor(root); if (t is Transform) { transform = (Transform)t; } } Transform rootTransform = root.VisualTransform; if (rootTransform != null) { transform = new MatrixTransform(Matrix.Multiply(transform.Value, rootTransform.Value)); } transform = new MatrixTransform( Matrix.Multiply(transform.Value, new TranslateTransform(root.VisualOffset.X, root.VisualOffset.Y).Value ) ); PathGeometry geometry = new PathGeometry(); System.Collections.ObjectModel.ReadOnlyCollection <Rect> rectangles = contentHost.GetRectangles(fce); foreach (Rect rect in rectangles) { geometry.AddGeometry(new RectangleGeometry(rect, 0, 0, transform)); } SerializeHyperlink(geometry, id, uri); } } }