From e85766dcc554aeb4a77ba1c08b4f31899dd0aa03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=BA=A2=E5=B8=BD?= <761716178@qq.com> Date: Wed, 24 Jan 2024 17:25:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3TextBox=E5=A4=9A=E5=B1=82?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E8=AF=BB=E5=8F=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CPF/Controls/TextBox.cs | 46 +++++++++++++++++++++++++++++++------ CPF/Controls/TextBoxView.cs | 6 ++--- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/CPF/Controls/TextBox.cs b/CPF/Controls/TextBox.cs index dae1456..8fca306 100644 --- a/CPF/Controls/TextBox.cs +++ b/CPF/Controls/TextBox.cs @@ -1442,24 +1442,40 @@ namespace CPF.Controls sb.Append("
"); StringBuilder textSb = new StringBuilder(); IDocumentContainer documentContainer = Document; - var l = Math.Min(caretIndex.Count, selectionEnd.Count); + var cs = caretIndex.ToList(); + var ss = selectionEnd.ToList(); + var l = Math.Max(cs.Count, ss.Count); + if (cs.Count < l) + {//假如两个索引层级不一样,要补充索引 + for (int i = 0; i < l - cs.Count; i++) + { + cs.Add(0); + } + } + if (ss.Count < l) + { + for (int i = 0; i < l - ss.Count; i++) + { + ss.Add(0); + } + } for (int i = 0; i < l; i++) { - if (caretIndex[i] > selectionEnd[i]) + if (cs[i] > ss[i]) { - GetText(sb, textSb, i, documentContainer, caretIndex, selectionEnd); + GetText(sb, textSb, i, documentContainer, cs, ss); break; } - else if (caretIndex[i] < selectionEnd[i]) + else if (cs[i] < ss[i]) { - GetText(sb, textSb, i, documentContainer, selectionEnd, caretIndex); + GetText(sb, textSb, i, documentContainer, ss, cs); break; } else { if (i < l - 1) { - documentContainer = documentContainer.Children[(int)caretIndex[i]] as IDocumentContainer; + documentContainer = documentContainer.Children[(int)cs[i]] as IDocumentContainer; if (documentContainer == null) { break; @@ -1499,7 +1515,23 @@ namespace CPF.Controls sb.Append(""); StringBuilder textSb = new StringBuilder(); IDocumentContainer documentContainer = Document; - var l = Math.Min(start.Count, end.Count); + start = start.ToList(); + end = end.ToList(); + var l = Math.Max(start.Count, end.Count); + if (start.Count < l) + {//假如两个索引层级不一样,要补充索引 + for (int i = 0; i < l - start.Count; i++) + { + start.Add(0); + } + } + if (end.Count < l) + { + for (int i = 0; i < l - end.Count; i++) + { + end.Add(0); + } + } for (int i = 0; i < l; i++) { if (start[i] > end[i]) diff --git a/CPF/Controls/TextBoxView.cs b/CPF/Controls/TextBoxView.cs index 0f3fff9..330955d 100644 --- a/CPF/Controls/TextBoxView.cs +++ b/CPF/Controls/TextBoxView.cs @@ -663,8 +663,8 @@ namespace CPF.Controls dc.FillRectangle(backBrush, backRect); } } - lastOffset = line.X + line.Width; - lastTop = line.Y; + lastOffset = document.Left + line.X + line.Width; + lastTop = document.Top + line.Y; } foreach (var line in documentContainer.Lines) { @@ -802,6 +802,6 @@ namespace CPF.Controls timer.Dispose(); } - + } }