我正在使用ScintillaNET
制作基本的IntelliSense编辑器。但是,在_editor.CallTip.Show("random text")
事件中调用AutoCompleteAccepted
时遇到问题。
例如,如果我键入pr
,然后在下拉列表中滚动并选择printf
,它将转到我的AutoCompleteAccepted
事件,当我调用CallTip.Show时,其余单词不会被添加(但是,如果没有该CallTip代码,该单词的其余部分将被填充)。
因此,如果我键入pr
,它将保持为pr
并显示我的CallTip。如何确保其余单词插入并显示CallTip?AutoCompleteAccepted
事件不是正确的名称吗?如果是这样,我应该在哪里调用CallTip.Show,使其与AutoComplete并排运行?
最佳答案
终于想通了! AutoCompleteAccepted
事件不是放置CallTip.Show的正确位置
发生的事实是,当调用AutoCompleteAccepted
事件并将文本添加到ScintillaNET控件时,UI需要花费时间来更新,因此,当您调用显示CallTip时,它会干扰正在插入的文本进入控制。
更好的方法是在TextChanged
事件中调用CallTip.Show,因为他们知道在调用AutoCompleteAccepted
事件时已插入文本。
现在看起来像这样:
String calltipText = null; //start out with null calltip
...
private void Editor_TextChanged(object sender, EventArgs e)
{
if (calltipText != null)
{
CallTip.Show(calltipText); //note, you may want to assign a position
calltipText = null; //reset string
}
...
}
...
private void Editor_AutoCompleteAccepted(object sender, AutoCompleteAcceptedEventArgs e)
{
if (e.Text == "someThing")
{
/* Code to add text to control */
...
calltipText = "someKindOFText"; //assign value to calltipText
}
}
从本质上讲,这是可以确保自动填充功能正确填充并显示CallTip的操作。
请注意,CallTip可能会出现在意想不到的地方,因此建议设置您希望CallTip出现的位置的值