我正在使用AvalonEdit为补丁文件创建一个视图,我想让它在整个行中突出显示差异,而不仅仅是文本背景 - 类似于今天的GitHub for Windows:
我是AvalonEdit的新手,所以我不确定最好的方法。这是我到目前为止所发现的:
覆盖VisualLineElementGenerator
以创建一个额外的TextSpan,它是控件的长度。这似乎很棘手。
创建一个新的控件,在后台添加到TextView.Layers
,用绿色/红色手动添加OnRender - 这看起来更有前途,但是我不太清楚我需要挂钩的事件才能检测何时重新渲染。
覆盖TextView - 这看起来有点矫枉过正。
编辑:以下是使用简单语法高亮显示的内容,这是我不想要的内容:
答案 0 :(得分:4)
正如Daniel所说,我通过Wiki页面发现了Background Renderers,它运行得很好。这就是我最终做的事情 - 它可能会变得更有效但现在已经足够好了:
public class DiffLineBackgroundRenderer : IBackgroundRenderer
{
static Pen pen;
static SolidColorBrush removedBackground;
static SolidColorBrush addedBackground;
static SolidColorBrush headerBackground;
FileDiffView host;
static DiffLineBackgroundRenderer()
{
removedBackground = new SolidColorBrush(Color.FromRgb(0xff, 0xdd, 0xdd)); removedBackground.Freeze();
addedBackground = new SolidColorBrush(Color.FromRgb(0xdd, 0xff, 0xdd)); addedBackground.Freeze();
headerBackground = new SolidColorBrush(Color.FromRgb(0xf8, 0xf8, 0xff)); headerBackground.Freeze();
var blackBrush = new SolidColorBrush(Color.FromRgb(0, 0, 0)); blackBrush.Freeze();
pen = new Pen(blackBrush, 0.0);
}
public DiffLineBackgroundRenderer(FileDiffView host)
{
this.host = host;
}
public KnownLayer Layer
{
get { return KnownLayer.Background; }
}
public void Draw(TextView textView, DrawingContext drawingContext)
{
foreach (var v in textView.VisualLines)
{
var rc = BackgroundGeometryBuilder.GetRectsFromVisualSegment(textView, v, 0, 1000).First();
// NB: This lookup to fetch the doc line number isn't great, we could
// probably do it once then just increment.
var linenum = v.FirstDocumentLine.LineNumber - 1;
if (linenum >= host.ViewModel.Lines.Count) continue;
var diffLine = host.ViewModel.Lines[linenum];
if (diffLine.Style == DiffLineStyle.Context) continue;
var brush = default(Brush);
switch (diffLine.Style)
{
case DiffLineStyle.Header:
brush = headerBackground;
break;
case DiffLineStyle.Added:
brush = addedBackground;
break;
case DiffLineStyle.Deleted:
brush = removedBackground;
break;
}
drawingContext.DrawRectangle(brush, pen,
new Rect(0, rc.Top, textView.ActualWidth, rc.Height));
}
}
}
答案 1 :(得分:3)
创建一个新控件以在后台添加到TextView.Layers,并手动添加绿色/红色的OnRender
您不必创建新图层以在后台呈现内容:您可以将IBackgroundRenderer
的实现添加到textView.BackgroundRenderers
以在现有图层的背景中呈现内容
我不清楚我需要挂钩什么事件来检测何时重新渲染
那将是:textView.VisualLinesChanged
。但是如果您使用IBackgroundRenderer
,则不需要这样做,因为AvalonEdit已经重新渲染了现有图层。