2012-02-02 30 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>です。

初めてオートコンプリートを呼び出すと正常に動作します。しかし、2回目にそれを使用すると、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(); 
     } 
    } 
} 
関連する問題