文本编辑器显示插入和删除

时间:2015-08-17 14:14:23

标签: .net wpf text

就像SO上的编辑历史一样,我希望显示插入和删除。我不需要子弹,链接或其他格式。只是原始文本为白色,删除为红色,并添加为绿色。我可以使用哪些工具来实现这一目标?

1 个答案:

答案 0 :(得分:1)

Google diff-match-patch可以满足您的需求,并且可以在c#中使用。 https://code.google.com/p/google-diff-match-patch/

获得Diffs列表后,您需要找到一种方法,通过使用某种转换器在RichTextBox中显示它们,该转换器接收Diffs集合并返回{{1} }}。您的FlowDocument将从FlowDocument个对象列表构建,可以为其指定颜色。然后,您可以将Run分配给FlowDocument属性。

我做的第一件事是围绕RichTextBox.Document对象

的视图模型包装器
Diff

将转换方法转换为FlowDocument

的转换方法
public class DiffViewModel : ViewModelBase
{
    private readonly Diff _model;

    public DiffViewModel(Diff model)
    {
        _model = model;
    }

    public Operation Operation { get { return _model.operation; } }
    public string Text { get { return _model.text; } }
}

然后,您可以创建private FlowDocument DiffsToFlowDocument(IEnumerable<DiffViewModel> differences) { var doc = new FlowDocument(); var p = new Paragraph(); foreach (var diff in differences) { var run = new Run(diff.Text); switch (diff.Operation) { case Operation.DELETE: run.Background = new SolidColorBrush(Colors.LightCoral); run.TextDecorations = TextDecorations.Strikethrough; run.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF252526")); break; case Operation.INSERT: run.Background = new SolidColorBrush(Colors.LightGreen); run.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF252526")); break; case Operation.EQUAL: break; default: throw new ArgumentOutOfRangeException(); } p.Inlines.Add(run); } doc.Blocks.Add(p); return doc; } ,将RichTextBox绑定到DataContext列表,并确保在DiffViewModels时创建并分配Document变化。不幸的是,DataContext不可绑定,因此我们必须使用一些代码来实现这一点。

RichTextBox.Document