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