Scintilla.NET自动完成会自动选择第一个元素(C#)

本文关键字:元素 第一个 NET Scintilla 选择 | 更新日期: 2023-09-27 18:22:25

我目前正在为Text组件创建一个使用Scintilla的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);
}

CCD_ 1是存储所有对象和相应类型的CCD_。

当我第一次调用自动完成时,它运行良好。但第二次使用它只会自动完成proposals的第一个元素。

Scintilla.NET自动完成会自动选择第一个元素(C#)

我认为问题是因为你试图在'.'之后使用打开自动完成象征您可以注意到,在您键入"后,自动完成功能将关闭或"(",然后选择当前单词作为自动完成的结果。我需要做同样的事情:在"之后打开自动完成列表象征解决方案非常简单,您可以在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();
        }
    }
}