Как сделать автозаполнение TextBox при наборе текста? Ограничено 3 словами?

У меня есть следующие слова, которые я хочу выбрать:

string standard = "select a part of the text in the textbox";

Когда кто-то вводит любую букву в приведенной выше строке, выберите по 3 слова за раз, пока не будет достигнут конец.

Например, человек набрал букву «о», поэтому я собираюсь выбрать первую букву «о» плюс 3 слова вперед, пока не закончу ее.

Я сделал скрипт, используя событие PreviewTextInput, и проблема в том, что он не может захватить набранное пространство, а также, когда я набираю букву в текстовом поле, она повторяется впереди и не выделяет остальные 3 слова.

КС

string typed = "";
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    string standard = "select a part of the text in the textbox";

    typed += e.Text;

    this.textBox1.Text = typed;

    int indexOf = standard.IndexOf(typed, StringComparison.OrdinalIgnoreCase);
    if (indexOf >= 0)
    {
        string start = standard.Substring(indexOf + typed.Length);
        string[] s = start.Split(' ');

        for (int i = 0; i < s.Length; i++)
        {
            if (i < 3) this.textBox1.Text += $"{s[i]} ";
            else break;
        }
    }
    this.textBox1.Focus();
    this.textBox1.SelectionStart = typed.Length;
    this.textBox1.SelectionLength = this.textBox1.Text.Length - typed.Length;
}

XAML

<Window x:Class = "WpfApp1.MainWindow"
        xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local = "clr-namespace:WpfApp1"
        mc:Ignorable = "d"
        Title = "MainWindow" Height = "450" Width = "800">
    <Grid>
        <TextBox Name = "textBox1" HorizontalAlignment = "Left" Height = "18" Margin = "143,107,0,0" TextWrapping = "NoWrap" Text = "" VerticalAlignment = "Top" Width = "308" PreviewTextInput = "TextBox_PreviewTextInput"/>    
    </Grid>
</Window>

Если я возьму тот же код, что и выше, и вставлю его Windows Forms в метод события KeyPress, он будет работать. Но почему это не работает в WPF?

Как я могу убедиться, что пока я набираю слово в текстовое поле, автозаполнение выполняется в режиме реального времени?

Я нашел эту статью wpf.2000things.com/2012/09/03/… и, возможно, вам стоит поиграть с другим событием.

Lukasz Szczygielek 21.12.2020 02:28
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
1
417
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Установите e.Handled = true в обработчике PreviewTextInput. «Предварительный просмотр» означает, что у вас будет возможность что-то сделать до того, как TextBox будет изменен. Установка для e.Handled значения true не позволит событиям ввода изменять TextBox.

        e.Handled = true;

это сработало! теперь мне нужно добавить еще одно событие KeyDown, чтобы захватить пространство

megaultron 21.12.2020 10:08

Другие вопросы по теме