Текстовое поле с шириной 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 иначе это не сработает.
Всё!
Если вам нужно такое поведение в нескольких местах - оформите эту конструкцию в виде отдельного контрола. Ну и не забудьте: если меняете размер шрифта - меняйте его у обоих элементов.
Комментариев нет:
Отправить комментарий