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