我需要知道我的窗口中插入符号当前所在的确切位置,以便我可以在文本下方弹出一个小窗口(类似于智能感知或拼写检查).问题是GetPositionFromCharIndex似乎不适用于TextBoxes.这就是我想要做的:
Point pt = mTextBox.GetPositionFromCharIndex(mTextBox.SelectionStart);
pt.Y = (int)Math.Ceiling(mTextBox.Font.GetHeight());
mListBox.Location = pt;
Run Code Online (Sandbox Code Playgroud)
但是,GetPositionFromCharIndex总是为TextBoxes返回(0,0)(显然它没有像RichTextBox那样实现).虽然这个函数(和这个代码)适用于RichTextBoxes,但我不希望将其余的代码从TextBox迁移到RichTextBox,除非是绝对的LAST度假胜地.有与RichTextBox的/文本框这么多的不兼容问题,我将不得不重新编写一个非常大的数据块的我的代码来做到这一点.
是否有任何Winforms巫师知道如何做到这一点?
我发现了文本框控件的一些特殊行为.当您在文本框的末尾键入文本时,GetPositionFromCharIndex仍为0,0.但是,如果在文本框中的最后一个字符之前插入文本,则会更新GetPositionFromCharIndex.
不知道你是否可以利用它,但我想你可能想知道这一点.
编辑:好的,大声笑,这似乎工作,它可能是多么丑陋......:
Point pt = textBox1.GetPositionFromCharIndex(textBox1.SelectionStart > 0 ? textBox1.SelectionStart - 1 : 0);
Run Code Online (Sandbox Code Playgroud)
编辑2:回想起来,我认为行为并不那么奇怪,因为文本框末尾的SelectionStart返回下一个字符将被输入的索引,而不是最后一个字符的实际位置.由于GetPositionFromCharIndex将返回一个字符位置,因此尚未存在的char的索引显然返回0,0.
编辑3:随着我和MikeJ的代码组合并略微重新设计,您可以获得插入符号的确切位置:
SizeF size = g.MeasureString(textBox1.Text.Substring(textBox1.SelectionStart - 1, 1), textBox1.Font);
pt.X += (int)size.Width;
Run Code Online (Sandbox Code Playgroud)
我承认,我输入它的方式真是太丑了,但是通过一些编辑,你应该可以从中获得一些不错的代码.