我想實現一些以編程方式更改文本背景時提供了文檔行的東西(與文本塊選擇看起來非常相似的東西)將此用於我設計的IDE的調試斷點)。我不想使用選擇,因爲它會導致文本框滾動。Avalonedit如何以編程方式更改文本的背景
我想我需要使用DocumentColorizingTransformer,但我不是100%確定如何去做這件事。
public class ColorizeAvalonEdit : ICSharpCode.AvalonEdit.Rendering.DocumentColorizingTransformer
{
protected override void ColorizeLine(ICSharpCode.AvalonEdit.Document.DocumentLine line)
{
int lineStartOffset = line.Offset;
string text = CurrentContext.Document.GetText(line);
int start = 0;
int index;
if (line.LineNumber == LogicSimViewCodeWPFCtrl.currentLine)
{
while ((index = text.IndexOf(text, start)) >= 0)
{
base.ChangeLinePart(
lineStartOffset + index, // startOffset
lineStartOffset + index + text.Length, // endOffset
(VisualLineElement element) =>
{
element.TextRunProperties.SetBackgroundBrush(Brushes.Red);
});
start = index + 1; // search for next occurrence
}
}
}
}
currentLine是將突出顯示的部分。
上面的代碼確實工作正常..唯一的問題是,如果currentLine有變化,而我正在查看該行,它不會突出更新的行,直到我滾動到文檔的另一部分(隱藏更新的行) ,然後回到更新後的行。
另外,如何讓行號從零開始?
欣賞的答案。然而,在看看sharpdevelop如何處理這個問題之後,我認爲不得不添加大量的類,接口來對代碼進行實質性的改變,以實現看似簡單的功能,這聽起來不太可行。 – l46kok 2012-08-17 04:19:21
在內心深處,SharpDevelop和你所做的一樣。它創建斷點作爲TextSegments的書籤標記。在TextMarkerService.ColorizeLine中,它可以找到它自己的標記(分段)並着色整行。你需要創建一個類MyMarker:TextSegment並將其保存在一個類型的變量中。 TextSegmentCollection。在ColorizeLine中,從TextMarkerService.ColorizeLine複製並完成。 –
edokan
2012-08-17 07:48:26
對於行號,您必須編輯LineNumberMargin.OnRender並構建AvalonEdit。 – edokan 2012-08-17 07:53:14