在AvalonEdit 5.x中更改行高

时间:2016-09-12 08:56:54

标签: c# avalonedit

这是此帖Changing default line height in avalon edit的后续内容。由于你不能在那篇文章中提出问题,我不得不在新帖子上问同样的问题。这是彼得摩尔的帖子,他解释了如何增加线高。

我认为我已按照他的说法实现了它,但它似乎并没有增加实际编辑器文本的高度/位置,但确实增加了文本的位置和行号的高度。请看下面的图片。

关于如何修复编辑器文本高度的任何想法?

在TextView.cs中:

    public static readonly DependencyProperty LineSpacingProperty =
        DependencyProperty.Register("LineSpacing", typeof(double), typeof(TextView),
        new FrameworkPropertyMetadata(1.0));

    public double LineSpacing
    {
        get { return (double)GetValue(LineSpacingProperty); }
        set { SetValue(LineSpacingProperty, value); }
    }

在VisualLine.cs(VisualLine.SetTextLines)中:

    internal void SetTextLines(List<TextLine> textLines)
    {
        this.textLines = textLines.AsReadOnly();
        Height = 0;
        TextView textView = new TextView();

        foreach (TextLine line in textLines)
            Height += (line.Height * textView.LineSpacing);
    }   

(VisualLine.GetTextLineVisualYPosition):

    public double GetTextLineVisualYPosition(TextLine textLine, VisualYPosition yPositionMode)
    {
        TextView textView = new TextView();

        if (textLine == null)
            throw new ArgumentNullException("textLine");
        double pos = VisualTop;
        foreach (TextLine tl in TextLines)
        {
            if (tl == textLine)
            {
                switch (yPositionMode)
                {
                    case VisualYPosition.LineTop:
                        return pos;
                    case VisualYPosition.LineMiddle:
                        return pos + (tl.Height * textView.LineSpacing) / 2;
                    case VisualYPosition.LineBottom:
                        return pos + (tl.Height * textView.LineSpacing);
                    case VisualYPosition.TextTop:
                        return pos + tl.Baseline - textView.DefaultBaseline;
                    case VisualYPosition.TextBottom:
                        return pos + tl.Baseline - textView.DefaultBaseline + textView.DefaultLineHeight;
                    case VisualYPosition.TextMiddle:
                        return pos + tl.Baseline - textView.DefaultBaseline + textView.DefaultLineHeight / 2;
                    case VisualYPosition.Baseline:
                        return pos + tl.Baseline;
                    default:
                        throw new ArgumentException("Invalid yPositionMode:" + yPositionMode);
                }
            }
            else
            {
                pos += (tl.Height * textView.LineSpacing);
            }
        }
        throw new ArgumentException("textLine is not a line in this VisualLine");
    }

然后在(VisualLine.GetTextLineByVisualYPosition)中:

    public TextLine GetTextLineByVisualYPosition(double visualTop)
    {
        TextView textView = new TextView();

        const double epsilon = 0.0001;
        double pos = this.VisualTop;
        foreach (TextLine tl in TextLines)
        {
            pos += (tl.Height * textView.LineSpacing);
            if (visualTop + epsilon < pos)
                return tl;
        }
        return TextLines[TextLines.Count - 1];
    }

最后在我的窗口类中:

        textEditor.TextArea.TextView.LineSpacing = 3.5f;

此处更改时间距不起作用,但如果我在依赖项属性中直接更改它,则会起作用。此外,这只会更改行号和编辑器的行间距,但编辑器“文本”位置不变。我做错了吗?

enter image description here

0 个答案:

没有答案