gpt4 book ai didi

c# - AvalonEdit 在其他格式上显示选择

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:52 24 4
gpt4 key购买 nike

我目前将以下代码用作带有 AvalonEdit TextEditorLineTransformer。我希望能够通过选择突出显示当前的单个搜索结果,但是该选择几乎不可见,因为 DocumentColorizingTransformer 的格式优先于显示突出显示的文本。如何让突出显示的选择显示而不是格式化或在格式化之前显示?

public class ColorizeSearchResults : DocumentColorizingTransformer {

public ColorizeSearchResults() : base() {
SearchTerm = "";
MatchCase = false;
}

public string SearchTerm { get; set; }
public bool MatchCase { get; set; }

protected override void ColorizeLine(DocumentLine line) {
if (SearchTerm.Length == 0)
return;

int lineStartOffset = line.Offset;
string text = CurrentContext.Document.GetText(line);
int count = 0;
int start = 0;
int index;
while ((index = text.IndexOf(SearchTerm, start, MatchCase ? StringComparison.CurrentCulture : StringComparison.CurrentCultureIgnoreCase)) >= 0) {
base.ChangeLinePart(
lineStartOffset + index,
lineStartOffset + index + SearchTerm.Length,
(VisualLineElement element) => {
element.TextRunProperties.SetForegroundBrush(Brushes.White);
element.TextRunProperties.SetBackgroundBrush(Brushes.Magenta);
});
start = index + 1;
count++;
}
}
}

Example of formatting showing over selection

最佳答案

参见 http://avalonedit.net/documentation/html/c06e9832-9ef0-4d65-ac2e-11f7ce9c7774.htm用于 AvalonEdit 渲染流程。

选择层在文本之前呈现。因此,如果文本有背景,它会覆盖选择背景。幸运的是,我们可以将背景设置为 Brush.Transparent(或 Selection.Brush 和您自己的颜色的混合)。

解决方案:我修改了 SelectionColorizer 代码以将选择背景重置为透明:

class SelectionColorizerWithBackground : ColorizingTransformer
{
ICSharpCode.AvalonEdit.Editing.TextArea _textArea;

public SelectionColorizerWithBackground(
ICSharpCode.AvalonEdit.Editing.TextArea textArea)
{
if (textArea == null)
throw new ArgumentNullException("textArea");
this._textArea = textArea;
}

protected override void Colorize(ITextRunConstructionContext context)
{
int lineStartOffset = context.VisualLine.FirstDocumentLine.Offset;

int lineEndOffset = context.VisualLine.LastDocumentLine.Offset +
context.VisualLine.LastDocumentLine.TotalLength;

foreach (var segment in _textArea.Selection.Segments)
{
int segmentStart = segment.StartOffset;
if (segmentStart >= lineEndOffset)
continue;

int segmentEnd = segment.EndOffset;
if (segmentEnd <= lineStartOffset)
continue;

int startColumn;
if (segmentStart < lineStartOffset)
startColumn = 0;
else
startColumn = context.VisualLine.ValidateVisualColumn(
segment.StartOffset, segment.StartVisualColumn,
_textArea.Selection.EnableVirtualSpace);

int endColumn;
if (segmentEnd > lineEndOffset)
endColumn =
_textArea.Selection.EnableVirtualSpace
? int.MaxValue
: context.VisualLine
.VisualLengthWithEndOfLineMarker;
else
endColumn = context.VisualLine.ValidateVisualColumn(
segment.EndOffset, segment.EndVisualColumn,
_textArea.Selection.EnableVirtualSpace);

ChangeVisualElements(
startColumn, endColumn,
element => {
element.TextRunProperties.SetBackgroundBrush(
System.Windows.Media.Brushes.Transparent);
if (_textArea.SelectionForeground != null)
{
element.TextRunProperties.SetForegroundBrush(
_textArea.SelectionForeground);
}
});
}
}
}

要使用您应该执行以下操作的代码:

var lineTransformers = textEditor.TextArea.TextView.LineTransformers;

// Remove the original SelectionColorizer.
// Note: if you have syntax highlighting you need to do something else
// to avoid clearing other colorizers. If too complicated you can skip
// this step but to suffer a 2x performance penalty.
lineTransformers.Clear();

lineTransformers.Add(new ColorizeSearchResults());
lineTransformers.Add(
new SelectionColorizerWithBackground(textEditor.TextArea));

关于c# - AvalonEdit 在其他格式上显示选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42078319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com