Пример #1
0
        /// <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)));
        }
Пример #2
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);
        }
Пример #3
0
        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);
                }
            }
        }