Я создал наследование пользовательского элемента управления TextBox
. Этот пользовательский элемент управления является числовым TextBox
, только поддержка чисел.
Я использую OnPreviewTextInput
проверять каждый новый символ, вводимый, чтобы видеть, является ли символ допустимым входом. Это работает отлично. Однако, если я вставляю текст в TextBox
, OnPreviewTextInput
не запущен.
Что лучший способ состоит в том, чтобы получить вставленный текст в a TextBox
?
Кроме того, у меня есть проблема, когда заднее пространство нажимается, я не могу выяснить, какое событие это запустит. OnPreviewTextInput
не запущен!
Любые идеи, как получить вставленный текст и спину, располагают события с интервалами в WPF TextBox
?
Вот некоторый код, который лежал у меня без дела на случай, если он мне когда-нибудь понадобится. Может помочь вам.
public Window1()
{
InitializeComponent();
// "tb" is a TextBox
DataObject.AddPastingHandler(tb, OnPaste);
}
private void OnPaste(object sender, DataObjectPastingEventArgs e)
{
var isText = e.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true);
if (!isText) return;
var text = e.SourceDataObject.GetData(DataFormats.UnicodeText) as string;
...
}
Для backspace проверьте событие PreviewKeyDown
Для команды paste добавьте привязку команды к ApplicationCommands. Paste, и установите аргумент в handled, если вы не хотите ничего с ним делать:
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Paste"
Executed="PasteExecuted" />
</Window.CommandBindings>
И в коде позади:
private void PasteExecuted(object sender, ExecutedRoutedEventArgs e)
{
e.Handled = true;
}
Проблема с попыткой перехвата и перехвата всех отдельных событий, которые могут вызвать изменение свойства TextBox.Text, заключается в том, что существует много таких событий:
Попытки надежно перехватить все это - бесполезное занятие. . Гораздо лучшее решение - отслеживать TextBox.TextChanged и отклонять изменения, которые вам не нравятся.
В ответе я показываю, как реализовать класс TextBoxRestriction для конкретного сценария, о котором спрашивают. Этот же метод можно обобщить для использования с любыми ограничениями, которые вы хотите наложить на свой элемент управления TextBox.
Например, в вашем случае вы можете реализовать присоединенное свойство RestrictValidChars
аналогично свойству RestrictDeleteTo
в этом коде. Это будет то же самое, за исключением того, что внутренний цикл будет проверять вставки, а не удаления. Его можно было бы использовать так:
<TextBox my:TextBoxRestriction.RestrictValidChars="0123456789" />
Это просто представление о том, как с этим можно справиться. Есть много способов структурировать код в зависимости от того, что вы хотите. Например, вы можете изменить TextBoxRestriction для вызова собственного кода для проверки с помощью присоединенного свойства, которое принимает делегат или объект, содержащий событие.
См. Другой ответ для получения подробной информации о том, как связать свойство Text при использовании класса TextBoxRestriction, чтобы оно не срабатывало, когда вы этого не хотите.