У меня есть следующие слова, которые я хочу выбрать:
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
?
Как я могу убедиться, что пока я набираю слово в текстовое поле, автозаполнение выполняется в режиме реального времени?
Установите e.Handled = true в обработчике PreviewTextInput. «Предварительный просмотр» означает, что у вас будет возможность что-то сделать до того, как TextBox будет изменен. Установка для e.Handled значения true не позволит событиям ввода изменять TextBox.
e.Handled = true;
это сработало! теперь мне нужно добавить еще одно событие KeyDown, чтобы захватить пространство
Я нашел эту статью wpf.2000things.com/2012/09/03/… и, возможно, вам стоит поиграть с другим событием.