Страницы

Поиск по вопросам

вторник, 21 мая 2019 г.

Выделение в TextBox с правой стороны

Текстовое поле с шириной Auto не имеет отступов внутри себя, границы текстового поля подпирают текст, выделить его с правого края крайне неудобно. Если задать Padding, то и курсор при наведении на получившийся отступ будет Arrow, и при клике с дальнейшем движении мыши влево выделения не произойдет. Таких проблем не возникает, если немного увеличить ширину текстового поля. Но нельзя - предполагается ввод текста.
В VS в редактируемых строках элементов интерфейса есть отступ.
В Word также отступы с трех сторон позволяют выделять текст при клике за границами текстовых символов (только слева поле имеет другие свойства). Что я сделал:
void TextBox_MouseEnter(object sender, MouseEventArgs e) { var tbEdit = sender as TextBox; tbEdit.Cursor = Cursors.IBeam; } void TextBox_MouseDown(object sender, MouseButtonEventArgs e) { var tbEdit = sender as TextBox;
var widthTextBox = tbEdit.ActualWidth; tbEdit.Padding = new Thickness(0); tbEdit.MinWidth = widthTextBox; } private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { TextBox tbEdit = sender as TextBox;
double pad = 20.0; if (tbEdit.Padding.Right < pad) { tbEdit.MinWidth = 10; tbEdit.Padding = new Thickness(0, 0, pad, 0); } }
Вопрос: можно ли сделать проще?


Ответ

Предлагаю использовать такой трюк - разместить в окне дополнительный TextBlock (ну или еще один TextBox - не принципиально важно, но, думаю, TextBlock будет немного быстрее работать), свойство Text второго элемента привязать к Text первого, а свойство Width первого привязать к ActualWidth второго, с помощью Padding во втором элементе теперь можно регулировать дополнительный отступ, после чего второй элемент можно скрыть:

обратите внимание, следует использовать именно Hidden, а не Collapsed иначе это не сработает.
Всё!

Если вам нужно такое поведение в нескольких местах - оформите эту конструкцию в виде отдельного контрола. Ну и не забудьте: если меняете размер шрифта - меняйте его у обоих элементов.

Комментариев нет:

Отправить комментарий