我目前正在使用Scintilla为Text组件创建一个IDE。但是自动完成有一些问题我无法修复。
输入后我会自动显示提案清单。在一个对象或类名之后。
然后我打电话给以下人员:
int pos = _editor.NativeInterface.GetCurrentPos();
string word = _editor.GetWordFromPosition(pos - 1);
if (string.IsNullOrEmpty(word))
return;
if (Objects.Keys.Contains(word))
{
System.Reflection.MemberInfo[] memberInfos = Reflector.PublicMembersOf(Objects[word]);
List<String> proposals = new List<string>();
foreach (System.Reflection.MemberInfo mi in memberInfos)
{
string member = mi.ToString();
if (Reflector.IsRealMethod(mi))
proposals.Add(mi.ToString().Split(" ".ToCharArray(), 2)[1].Replace(" ", ""));
}
proposals.Sort();
_editor.AutoComplete.Show(0, proposals);
}
Objects
是HashMap<String, Type>
,其中存储了所有对象和相应的类型。
当我第一次调用自动完成时它工作正常。但是第二次使用它只是自动填充proposals
的第一个元素。
答案 0 :(得分:1)
我认为这个问题是因为你试图在“。”之后使用开放式自动完成功能。符号。您可以注意到在输入“。”后将关闭自动填充功能。或'''并选择当前单词作为自动完成的结果。 我需要做同样的事情:在'。'之后打开自动完成列表。符号。解决方案很简单,你可以在10毫秒后打开它。例如,使用此代码:
private void scintillaCs_CharAdded(object sender, ScintillaNET.CharAddedEventArgs e)
{
ScintillaNET.Scintilla editor = sender as ScintillaNET.Scintilla;
if (e.Ch == '.')
{
Timer t = new Timer();
t.Interval = 10;
t.Tag = editor;
t.Tick += new EventHandler((obj, ev) =>
{
// make a new autocomplete list if needed
List<string> s = new List<string>();
s.Add("test");
s.Add("test2");
s.Add("test3");
s.Sort(); // don't forget to sort it
editor.AutoComplete.ShowUserList(0, s);
t.Stop();
t.Enabled = false;
t.Dispose();
});
t.Start();
}
}
}