首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在CodeBehind中更新FlowDocument的文本

在CodeBehind中更新FlowDocument的文本
EN

Stack Overflow用户
提问于 2018-06-01 02:02:42
回答 2查看 306关注 0票数 0

我需要在不更改现有格式的情况下更改FlowDocument的文本,但在这样做时遇到了问题。

我的想法是在文档中做一个Blocksforeach。然后,对于任何Paragraph,执行Inlinesforeach,如下所示;

代码语言:javascript
复制
foreach (var x in par.Inlines)
{
    if (x.GetType() == typeof(Run))
    {
        Run r = (Run)x;
        r.Text = r.Text.Replace("@", "$");
    }
}

问题是,这会返回以下错误消息;

System.InvalidOperationException:‘集合已修改;可能无法执行枚举操作。’

这样做的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-01 03:00:10

通常的解决方案是在集合上调用ToList()并遍历由ToList()返回的新集合。

代码语言:javascript
复制
var runs =
    flowdoc.Blocks.OfType<Paragraph>()
    .SelectMany(par => par.Inlines).OfType<Run>()
    .ToList();

foreach (var r in runs)
{
    r.Text = r.Text.Replace("@", "$");
}
票数 1
EN

Stack Overflow用户

发布于 2018-06-01 02:39:26

您的错误来自于尝试在修改集合的同时使用foreach循环枚举集合。使用for循环。

要更改流程文档中的文本,请尝试使用TextPointer + TextRange,下面是一个示例(这个更改文本背景,但您也可以同样轻松地更改文本)。

代码语言:javascript
复制
private void ClearTextHighlight(FlowDocument haystack)
{
    TextPointer text = haystack.ContentStart;
    TextPointer tpnext = text.GetNextContextPosition(LogicalDirection.Forward);

    while (tpnext != null){
        TextRange txt = new TextRange(text, tpnext);
        //access text via txt.Text

        //apply changes like:
        var backgroundProp = txt.GetPropertyValue(TextElement.BackgroundProperty) as SolidColorBrush;

        if(backgroundProp != null && backgroundProp.Equals(Setting_HighlightColor)){
            //change is here
            txt.ApplyPropertyValue(TextElement.BackgroundProperty, Setting_DefaultColor);                
        }
        text = tpnext;
        tpnext = text.GetNextContextPosition(LogicalDirection.Forward);   
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50630269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档