#c_sharp #wpf
Текстовое поле с шириной 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); } } Вопрос: можно ли сделать проще?
Ответы
Ответ 1
Предлагаю использовать такой трюк - разместить в окне дополнительный TextBlock (ну или еще один TextBox - не принципиально важно, но, думаю, TextBlock будет немного быстрее работать), свойство Text второго элемента привязать к Text первого, а свойство Width первого привязать к ActualWidth второго, с помощью Padding во втором элементе теперь можно регулировать дополнительный отступ, после чего второй элемент можно скрыть: обратите внимание, следует использовать именно Hidden, а не Collapsed иначе это не сработает. Всё! Если вам нужно такое поведение в нескольких местах - оформите эту конструкцию в виде отдельного контрола. Ну и не забудьте: если меняете размер шрифта - меняйте его у обоих элементов.
Комментариев нет:
Отправить комментарий