我正在使用ScintillaNET制作基本的IntelliSense编辑器。但是,在_editor.CallTip.Show("random text")事件中调用AutoCompleteAccepted时遇到问题。

例如,如果我键入pr,然后在下拉列表中滚动并选择printf,它将转到我的AutoCompleteAccepted事件,当我调用CallTip.Show时,其余单词不会被添加(但是,如果没有该CallTip代码,该单词的其余部分将被填充)。

因此,如果我键入pr,它将保持为pr并显示我的CallTip。如何确保其余单词插入并显示CallTip?

AutoCompleteAccepted事件不是正确的名称吗?如果是这样,我应该在哪里调用CallTip.Show,使其与AutoComplete并排运行?

最佳答案

终于想通了! AutoCompleteAccepted事件不是放置Call​​Tip.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出现的位置的值

09-17 07:19