2013-03-02 1 views
0

Я работаю над текстовым редактором, и я хотел бы знать, как реализовать функцию автозаполнения.Скрытый ListBox появится во время ввода слов в RichTextBox

У меня есть этот набор строк в моем отдельном классе (KeyWord.cs)

public String[] keywords = { "abstract", "as", "etc." }; 
public String[] events = { "AcceptRejectRule", "AccessibleEvents", "etc.2" }; 

, что у меня уже есть входные строки в ListBox (фунты) расположен мой MainForm, которые уже отсортированы:

lb = new ListBox(); 
Controls.Add(lb); 
//lb.Visible = false; 

KeyWord keywordsL = new KeyWord(); 
KeyWord eventsL = new KeyWord(); 
foreach (string str in keywordsL.keywords) 
{ 
    lb.Items.Add(str); 
} 
foreach (string str in eventsL.events) 
{ 
    lb.Items.Add(str); 
} 

и RichTextBox, который служил редактором (также с подсветкой), объявленным как rtb.

Теперь моя забота заключалась в том, как я могу сделать его похожим на его «contexthint», например, когда я ввожу букву «A» в RichTextBox (rtb), скрытый список появится в том месте, где находился указатель мыши, а затем все появится «A» в начале строк, перечисленных в списке. Наконец, когда я выбираю показанную строку из списка, строка будет добавлена ​​в RichTextBox?

+0

так же, как и при вводе текста «А», затем следующего «с», весь первый буклет «Как» будет сортироваться и оставаться в списке? – 2013-03-02 05:00:03

+0

Вы имеете в виду нечто вроде меню автозаполнения от intellisense ..? Посмотрите на [FastColoredTextBox] (http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlighting) или [AvalonEdit] (http://www.codeproject.com/Articles/ 42490/Using-AvalonEdit-WPF-Text-Editor) – l46kok

+0

да точно. @ О ссылках, которые я не могу использовать в качестве ссылки в этом проекте. Мне нужны коды. – 2013-03-02 05:20:53

ответ

0

Легкий способ реализовать это, чтобы сделать что-то вроде этого:

private List<string> autoCompleteList = new List<string>(); 

public Form1() 
{ 
    autoCompleteList.Add("Items for the autocomplete"); 
} 
... 

private void textBox1_TextChanged(object sender, System.EventArgs e) 
{ 
    listBox1.Items.Clear(); 
    if (textBox1.Text.Length == 0) 
    { 
     hideAutoCompleteMenu(); 
     return; 
    } 

    Point cursorPt = Cursor.Position; 
    listBox1.Location = PointToClient(cursorPt); 

    foreach (String s in autoCompleteList) 
    { 
     if (s.StartsWith(textBox1.Text)) 
     { 
      listBox1.Items.Add(s); 
      listBox1.Visible = true; 
     } 

    } 
} 

private void hideAutoCompleteMenu() 
{ 
    listBox1.Visible = false; 
} 

private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) 
{ 
    textBox1.Text = listBox1.Items[listBox1.SelectedIndex].ToString(); 
    hideAutoCompleteMenu(); 
} 

Однако, вы должны рассмотреть все возможные случаи угловых при реализации этой функции, такие как,

  • Что произойдет, если пользователь нажимает ESC/Enter во время ввода чего-либо?
  • Что произойдет, если пользователь потеряет фокус на richtextbox?
  • Как насчет обработки клавиш со стрелками вверх и вниз, пока список открыт?
  • Проблема с производительностью, когда в списке есть тонны предметов для поиска?

Хотя некоторые из вышеперечисленных проблем - это вопрос обработки дополнительных событий, приведенный выше код является очень быстрым и грязным способом реализовать то, что вы хотите, но на самом деле кажется, что вы делаете это, изобретая колесо для того, что уже доступно. Я предлагаю вам посмотреть исходный код в AvalonEdit и FastColoredTextBox, чтобы узнать, как это ДЕЙСТВИТЕЛЬНО сделано.

+0

ok спасибо, сэр за идею ... – 2013-03-02 07:48:38

+0

хорошо оцененный сэр. – 2013-03-02 08:01:23

+0

У меня только проблемы с этим. Оба avalon и fastcoloredtextbox имеют собственный инструмент и ссылку w/c, я не могу найти способ работы кода ... :( – 2013-03-02 08:14:16