2012-02-02 57 views
0

我目前正在使用Scintilla爲Text組件創建一個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); 
} 

ObjectsHashMap<String, Type>所有的對象,並有相應的類型存儲。

當我第一次調用自動完成時,它工作正常。但第二次使用它會自動完成proposals的第一個元素。

+0

對此沒有評論?你需要更多的代碼嗎?我真的需要這個,我沒有完成它。 – 2012-02-07 09:11:58

回答

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(); 
     } 
    } 
}