Изменение размера текстового элемента управления WinForms на основе MaxLength - PullRequest
0 голосов
/ 30 июля 2009

У меня есть ситуация (поиск по ключу), где у меня будет несколько входов различной, но ограниченной длины. Итак, я создаю общий элемент управления для использования для каждого ввода, и этот элемент управления имеет TextBox для использования, когда тип ввода - это текст произвольной формы. В этом случае я бы хотел, чтобы длина TextBox отражала ограничение, наложенное на входные данные на основе свойства MaxLength объекта TextBox (или, по крайней мере, на некоторой максимальной длине).

Как я могу это сделать? Я понимаю, что это технически невозможно с символами переменной ширины, но мне интересно приблизиться. Максимальная длина полей варьируется от 3 до 90 символов.

Ответы [ 5 ]

4 голосов
/ 30 июля 2009

Я бы постарался избежать этого динамического подхода.
Вы действительно думаете, что это повышает ценность для пользователя? На мой взгляд, это выглядит странно, когда общий элемент управления постоянно выглядит по-другому. Как вы думаете, пользователь может различаться между текстовым полем, которое позволяет 32 символа и одно, которое позволяет 29 символов? Как насчет экстремальных значений? Например, когда разрешены только три символа - или даже 1024.
Я бы всегда делал TextBox одинаковой длины - это лучше для вашего контроля и проще в реализации. Когда пользователю требуется подсказка о максимальной длине текста, добавьте метку с надписью «осталось 29 символов», которая обновляется во время ввода ...

1 голос
/ 30 июля 2009

Было бы проще и потенциально приятнее визуально «разбивать» размеры текстовых полей. Выберите ширину, которая подходит для полей из 1-5 символов, затем ширину для 6-10, затем 11-20,20-30,30-50 и т. Д. Таким образом, вы можете избежать странных проблем визуального выравнивания, которые могут возникнуть если вы попытались сложить по вертикали поля из 29, 32 и 27 символов.

1 голос
/ 30 июля 2009

Один из способов сделать это, но не на 100%, - это использовать метод MeasureString из объекта Graphics, чтобы увидеть, насколько широкими являются символы X, со шрифтом, который в настоящее время используется текстовое поле.

Оттуда вы можете рассчитать необходимое «дополнительное», чтобы покрыть границы и т. Д. Не точная наука, но это сработает.

Другие мысли

Измерение всей строки может быть немного неэффективным, вы можете измерить 1 символ X (который обычно больше других), а затем умножить его на все

0 голосов
/ 30 июля 2009

Основываясь на том, что было сказано до сих пор, я думаю, что идеальное решение в этом случае - это сочетание предложения Джона и предложения Митчела и упрощенной версии. Итак, я собираюсь рассчитать длину, используя стандартный символ (скажем, «C»), а затем установить ширину, равную [border slack] + ([длина символа] * ([количество символов] + [5 - число персонажей мод 5])).

При каждом изменении шрифта мне придется пересчитывать длину символа и ширину поля.

0 голосов
/ 30 июля 2009

Это (почти) невозможно со шрифтами переменной ширины.

Полагаю, вы могли бы попытаться найти относительно "широкий" символ, но это все равно может вызвать проблемы.

Самым простым решением, вероятно, было бы найти удовлетворительную ширину символов (и, возможно, жестко закодировать ее для размера / семейства шрифтов), а затем просто умножить это на максимальную длину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...