コード例 #1
0
        protected override void Render(DrawingContext ctx)
        {
            if (Core == null || Core.IsDisposed)
            {
                return;
            }
            base.Render(ctx);
            IMRATextItemInfo item = ViewParent?.Core;
            ITextBoxCore     core = ViewParent?.TextCore;
            WinTextLine      text = ViewParent?.TextLine;

            if (core == null)
            {
                return;
            }
            ITextPosition start = core.SelectedStart;
            ITextPosition end   = core.SelectedEnd;

            if (start.CompareTo(end) == 0)
            {
                ITextPosition pos = start.NextSeek();
                RenderBracket(ctx, pos);
                RenderDefaultMatch(ctx, pos);
                pos = pos.PrevSeek();
                RenderBracket(ctx, pos);
                RenderDefaultMatch(ctx, pos);
            }
            if (start.Line == end.Line && start.Column == end.Column)
            {
                status = start.Line == item.Line ? SelectionStatus.Caret : SelectionStatus.None;
            }
            else if (item.Line >= start.Line && item.Line <= end.Line)
            {
                status = SelectionStatus.Range;
            }
            else
            {
                status = SelectionStatus.None;
            }
            switch (status)
            {
            case SelectionStatus.None:
                break;

            case SelectionStatus.Caret:
            {
                if (!blinkshow && !forceshow)
                {
                    break;
                }
                int        index     = start.Column - 1;
                TextBounds bound     = text.GetTextBounds(index, 1).FirstOrDefault();
                Brush      brush     = null;
                double     thickness = 1.0;
                ViewParent.TextCore.DictBrush.TryGetValue("foreground_rawtext_caret", out brush);
                ViewParent.TextCore.DictValue.TryGetValue("rawtext_caret_thickness", out thickness);
                Pen   pen = new Pen(brush, thickness);
                Point p1  = bound.Rectangle.TopLeft;
                Point p2  = bound.Rectangle.BottomLeft;
                p1.Y -= 2;
                p1.X += ViewParent.TextCore.View.MarginLeft;
                p2.X += ViewParent.TextCore.View.MarginLeft;
                ctx.DrawLine(pen, p1, p2);
            }
            break;

            case SelectionStatus.Range:
            {
                //int left = start.Column - 1;
                //int right = end.Column - 1;
                if (start.Line < item.Line)
                {
                    start = Core.Start;
                }
                if (end.Line > item.Line)
                {
                    end = Core.End;
                }
                //if (right - left <= 0) break;
                //TextBounds bound = text.GetTextBounds(left, right - left).FirstOrDefault();
                Brush brush = null;
                //Rect rect = bound.Rectangle;
                ViewParent.TextCore.DictBrush.TryGetValue("background_rawtext_selected", out brush);
                //rect.X += ViewParent.TextCore.View.MarginLeft;
                //ctx.DrawRectangle(brush, null, rect);
                DrawTextRectangle(ctx, brush, null, start, end);
            }
            break;
            }
        }