2012-02-02 7 views
0

현재 Text 구성 요소에 Scintilla를 사용하여 IDE를 만들고 있습니다. 하지만 자동 완성 기능에는 고정되어 있지 않은 문제가 있습니다.Scintilla.NET 자동 완성은 첫 번째 요소 (C#)를 자동으로 선택합니다.

입력 한 후 자동으로 제안 목록을 표시합니다. 객체 또는 클래스 이름 뒤.

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(); 
     } 
    } 
} 
관련 문제