2009-07-14 2 views
1

У меня есть приложение, которое объявляет текстовые поля в разных местах, например, в стилях и datatemplates, и теперь я в ситуации, когда мне нужно изменить стандартное поведение каждого текстового поля для получения и потери фокуса.Изменение стандартного поведения TextBox?

Каков хороший способ сделать это?

Я думал о двух решениях: один должен вывести новый класс из TextBox, который, как я понимаю, обычно неодобрительно. Другой - создать какой-то стиль, который использует EventSetters, но поскольку стили и datatemplates в моем приложении не имеют файлов кода, я не знаю, как событие найдет соответствующий обработчик событий.

+1

Из любопытства: почему производный от TextBox обычно неодобрительно? – Tim

+1

@ Тим: Мне было интересно то же самое. – Treb

+0

Мое впечатление заключалось в том, что многое, если не большинство, функциональности, которую можно было бы достичь, вызывая новый класс, действительно можно сделать с помощью событий. – djcouchycouch

ответ

2

Вы можете создать стиль, который применяется ко всем TextBoxes, используя свойство ключа следующим образом:

<Style x:Key={x:Type TextBox}> 
... 
</Style> 

Вы можете изменить шаблон свойства TextBox и использовать триггеры, чтобы добавить специальное поведение в OnGotFocus и OnLostFocus Мероприятия.

+0

Работает для меня. Таким образом, я могу просто объявить один стиль и повлиять на каждое текстовое поле, не изменяя другие мои другие ресурсы. – djcouchycouch

0

В нормальных обстоятельствах, я тоже не хотел бы подклассифицировать TextBox. В этом случае, поскольку вы меняете поведение TextBox, подкласс может быть вашим лучшим вариантом.

+2

Не могли бы вы объяснить, почему подклассификация TextBox (или любого другого элемента управления) может быть плохой идеей? – Treb

2

Основываясь на вашей обратной связи, я бы рекомендовал присоединенное поведение используется следующим образом:

<TextBox b:TextBox.SuppressOnFocus="True"/> 

Прилагаемая реализация поведения будет просто приложить к GotFocus и LostFocus и ясно/повторно связывание в зависимости от обстоятельств.

+0

Мои текстовые поля привязаны к свойствам, которые постоянно обновляются. Всякий раз, когда текстовое поле находится в фокусе, даже если пользователь пытается ввести что-либо, текст текстового поля получает значение свойства. Что бы делали события GotFocus и LostFocus, так это временно включать и отключать привязку данных во время ввода пользователем. – djcouchycouch

+0

Прилагаемое поведение звучит более подходящим для ваших нужд. Обновление моего сообщения ... –

0

Если вы собираетесь использовать эту функциональность только в одном проекте, вы можете создать UserControls с текстовым полем и получить доступ к свойствам OnFocus. Вы также можете создать пользовательский элемент управления WPF, который происходит из TextBox, а затем реализует событие LocusFocus.

Я использовал тот же подход, чтобы создать TextBox управления пользователя, который выполняет проверку:

http://www.highoncoding.com/Articles/578_Creating_WPF_TextBox_UserControl_to_Perform_Custom_Validation.aspx

Смежные вопросы