Страницы

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

среда, 4 марта 2020 г.

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

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

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

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