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();
         }
 
-        
+
     }
 }