WPF - Text Formatter抛出ArgumentOutOfRangeException

时间:2015-09-05 13:37:10

标签: c# .net wpf

使用文本格式化程序API 时遇到了一些问题并需要帮助。

我有一个文本运行的LinkedList(我创建了Run类,它有一个Text属性,用于存储文本字符串和一堆属性,用于定义文本格式选项) 。我还实现了我的CustomTextSource课程(源自TextSource)。 GetTextRun方法实现:

public override TextRun GetTextRun(int textSourceCharacterIndex)
    {
        Run run = Document.Runs.ToList().Find(x => x.Contains(textSourceCharacterIndex));
        if (run == null)
        {
            return new TextEndOfParagraph(1);
        }

        if (run.Length == 1 && run.Text.ToString()[0] == '\n')
        {
            return new TextEndOfLine(1);
        }

        return new TextCharacters(run.Text.ToString(),
                run.Start, run.Length,
                new GenericTextRunProperties(run.Formatting));
    }

其中Contains是Run class的方法:

public bool Contains(int index)
    {
        return (Start <= index) && ((Start + Length) > index);
    }

StartLength属性只是整数,用于存储文本运行的开始和长度。

问题在于,在某些情况下,GetTextRun方法会在最后一个return语句中抛出ArgumentOutOfRangeException,并显示以下消息:&#34; 参数的值可以&#39; t大于[数字]。参数名称:offsetToFirstChar &#34;。

例如,当文本存储具有表示新行的字符(新行字符存储在单独的运行中),并且一旦Text Formatter使用此字符运行,然后尝试进行下一次运行(让我们调用此运行&#34; RunAfterNewLine &#34;)异常消息中的[number]等于( RunAfterNewLine .Length - 1)。

所以任何人都可以解释为什么它会发生以及如何解决它? 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

从文档中,offsetToFirstChar(您传递run.Start的地方)是

  

在characterString中使用的第一个字符的偏移量。

characterString是您传递run.Text.ToString()的第一个参数。

假设run.Text.ToString()只返回该运行中的文本而不是文档的整个文本,那么你不应该只传递0吗?