如何使用 C# 在文本框中查找插入符位置?

How To Find The Caret Position In A TextBox Using C#?

我的 WindowsFormApps 中有一些 TextBoxMultiLine TextBoxRichTextBox 使用 Visual Studio 2015。现在我想让我的用户在这些字段中键入文本,并且我想连续知道 Caret Pointer 位置(X 轴,Y 轴)是我的用户在文本末尾还是在开始时键入文本文本或文本中间的任何位置。

我能否在 运行 时间连续在某些 class 级别变量中获得正确的位置(X 轴,Y 轴)以在其他地方使用它...???

添加代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace DEMO_Apps
    {
        public partial class MainForm : Form
        {
            int xpos;
            int ypos;
            public MainForm()
            {
                InitializeComponent();
            }
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                var o = Utility.GetCaretPoint(textBox1);
                xpos = o.X;
                ypos = o.Y;
                textBox2.Text = Convert.ToString(xpos + "," +  ypos);                
            }     
        }

        public static class Utility
        {
            ///for System.Windows.Forms.TextBox
            public static System.Drawing.Point GetCaretPoint(System.Windows.Forms.TextBox textBox)
            {
                return textBox.GetPositionFromCharIndex(textBox.SelectionStart);
            }

            ///for System.Windows.Controls.TextBox
            public static System.Windows.Point GetCaretPoint(System.Windows.Controls.TextBox textBox)
            {
                return textBox.GetRectFromCharacterIndex(textBox.SelectionStart).Location;
            }
        }
    }

您可以使用 TextBox 的 .SelectionStart 属性 来获取插入符号的位置。

int positionOfcarett = txtSample.SelectionStart;

让文本框中的文本 txtSampleABCD 并且插入符号当前位于 BC 之间,上面的代码将为您提供 positionOfcarett =2;

根据评论更新:

如果您想获得文本框上的鼠标位置,您需要使用 TextBox1_MouseMove 事件 从中您还将获得 X 轴值和 Y 轴值。

 int xpos = e.X;
 int ypos = e.Y;

如果你想得到它对表格的引用然后使用Form__MouseMove

根据你编辑的问题,我检查了代码,发现当插入符在最后一个字符时,函数给出了空位置,所以我改变了一点,下面的函数应该给你你想要的:

 namespace DEMO_Apps
{
    public partial class MainForm : Form
    {
        int xpos;
        int ypos;
        public MainForm()
        {
            InitializeComponent();
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            var o = Utility.GetCaretPoint(textBox1);
            xpos = o.X;
            ypos = o.Y;
            textBox2.Text = Convert.ToString(xpos + "," +  ypos);                
        }     
    }

    public static class Utility
    {
        ///for System.Windows.Forms.TextBox
        public static System.Drawing.Point GetCaretPoint(System.Windows.Forms.TextBox textBox)
        {
            int start = textBox.SelectionStart;
            if (start == textBox.TextLength)
            start --;

            return textBox.GetPositionFromCharIndex(start);
        }

        ///for System.Windows.Controls.TextBox requires reference to the following dlls: PresentationFramework, PresentationCore & WindowBase.
        //So if not using those dlls you should comment the code below:

        public static System.Windows.Point GetCaretPoint(System.Windows.Controls.TextBox textBox)
        {
            return textBox.GetRectFromCharacterIndex(textBox.SelectionStart).Location;
        }
    }
}