C# FlowDocument扩展上一次运行而不是创建新运行

C# FlowDocument扩展上一次运行而不是创建新运行,c#,wpf,flowdocument,C#,Wpf,Flowdocument,我正在开发一个处理文本样式选择的用户控件,我遇到了一个问题: 在我的控件中输入文本“这是一堆文本” 突出显示“文本” 执行更改所选内容样式的操作 按空格键(或输入字母)-应取消样式设置时,样式设置将继续 在内部,我认为这将流程文档分为两个独立的“运行”,运行1是“这是一堆”,运行2是“文本” 但是,在设置样式后按空格键时,它只是扩展了运行2,更改了样式(这是一个主要问题) 我已尝试使用以下方法在选择结束时向文档中插入空白运行: new Run(String.Empty, Selection

我正在开发一个处理文本样式选择的用户控件,我遇到了一个问题:

  • 在我的控件中输入文本“这是一堆文本”
  • 突出显示“文本”
  • 执行更改所选内容样式的操作
  • 按空格键(或输入字母)-应取消样式设置时,样式设置将继续

在内部,我认为这将流程文档分为两个独立的“运行”,运行1是“这是一堆”,运行2是“文本”

但是,在设置样式后按空格键时,它只是扩展了运行2,更改了样式(这是一个主要问题)

我已尝试使用以下方法在选择结束时向文档中插入空白运行:

new Run(String.Empty, Selection.End);
new Run(" ", Selection.End);
然而,这并不意味着;不起作用,第二次运行仍在更改

解决此问题的一种方法是执行以下操作:

new Run(String.Empty, Selection.End);
new Run(" ", Selection.End);
但是,如果我手动将插入符号移动到样式的末尾并按空格键,它仍会继续样式:(

我对此有点束手无策,如果有人能提供任何指导,我将不胜感激

对于任何感兴趣的人,这里是上下文菜单(应用样式)上ICommand的源代码


对于那些偶然发现这个问题并想知道它是否得到解决的人,我提出了一个解决方案:

我在TextChanged事件中添加了一个事件:

    private void TaggableTextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextChanged -= TaggableTextBox_TextChanged;

        ReprocessTags();
    }

    private void ReprocessTags()
    {
        //Remove all tags, and re-process
        RemoveAllTags();
        ProcessTags();
    }

    private void RemoveAllTags()
    {
        var textRange = new TextRange(Document.ContentStart, Document.ContentEnd);
        textRange.ClearAllProperties();
    }

    private void ProcessTags()
    {
        if (Tags == null) 
            return;

        foreach (var tag in Tags.ToArray())
        {
            TagRegion(tag.Start, tag.Length, tag.Type);
        }
    }

    private void TagRegion(int index, int length, TagType type)
    {
        var start = GoToPoint(Document.ContentStart, index);
        var end = GoToPoint(start, length);

        TagSelection(type, start, end);
    }
它需要清理,但基本上,我清除了FlowDocument中的所有格式,然后重新处理它们,有效地创建新的运行,从而解决了问题

我希望这能帮助别人