防止插入符号在行开头和第一个VisualLineElement之间定位(在VisualColumn == 0)

时间:2013-05-23 17:46:59

标签: avalonedit

我正在开发一个依赖 AvalonEdit 来管理文档的项目。本文档中的某些行标记为使用特定缩进,无法在 AvalonEdit 中修改。

我设法用VisualLineElements来实现这一点,这些是在这些标记行的开头注入的。视觉元素的缩写大小为DocumentLength 0VisualLength。我还覆盖了GetNextCaretPosition方法,以便将插入符号“推”到VisualLineElement的左侧(在向后移动的情况下)或向右移动(在向前移动的情况下)。

以下是格式缩小的VisualLineElement版本(请注意,该元素始终在VisualColumn == 0处注入):

public class MyLineFormatElement : VisualLineElement
{
    private readonly string _elementText;

    public MyLineFormatElement (string elementText)
        : base(elementText.Length, 0)
    {
        _elementText = elementText;
    }

    public override bool CanSplit
    {
        get
        {
            return false;
        }
    }

    public override int GetNextCaretPosition(int visualColumn, System.Windows.Documents.LogicalDirection direction, ICSharpCode.AvalonEdit.Document.CaretPositioningMode mode)
    {
        if (visualColumn >= VisualColumn && visualColumn <= VisualColumn + VisualLength)
        {
            return direction == LogicalDirection.Forward ? VisualColumn + VisualLength : VisualColumn;
        }

        return base.GetNextCaretPosition(visualColumn, direction, mode);
    }

    public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context)
    {
        return new TextCharacters(_elementText, TextRunProperties);
    }
}

除了我遇到的一个问题之外,它的效果很好:我仍然可以将插入符号放在行的开头。从用户的角度来看,这非常令人困惑。更糟糕的是,在行开头按“删除”,或者在缩进结束时按“退格”只需移动插入符号而不进行任何修改。据我了解,如果插入符号不能放在行开头(基于CaretNavigationCommandHandler.OnMoveCaret中的代码),则删除/退格问题将得到解决。

关于如何解决此问题,我最好的猜测是覆盖HandlesLineBorders属性,使其返回true,然后修改GetNextCaretPosition,以便: 1.当向前移动元素时,return VisualColumn + VisualLength(已经是这种情况) 2.当向后移动元素时,返回上一行的最后一个视觉列(我不知道该怎么做)

#2的最后一部分可能吗?如果是这样,我该怎么做?如果没有,我还有其他方法吗?我真的很想坚持使用VisualLineElements来保持文档的实际内容与呈现方式之间的清晰分离。

1 个答案:

答案 0 :(得分:1)

返回-1;这意味着VisualLineElement(搜索方向)内没有更多的插入点停止。

AvalonEdit 4.1中的NewLineTextElement(表示行尾的符号)是使用相同的方法实现的(但实现虚拟空间时4.2的实现已更改)。

您还应该覆盖IsWhitespace并返回true。当AvalonEdit尝试检测缩进时(当启用自动换行和options.InheritWordWrapIndentation时),这很重要。