Mr.TMG Ответов: 3

Отрегулируйте размер шрифта в соответствии с пользовательским контролем


Привет,
У меня есть пользовательский элемент управления, предназначенный для отображения имен. Внутри элемента управления есть метка, которая всегда должна оставаться центрированной и может иметь неизвестную длину текста.

Существуют ли какие-либо умные методы для настройки размера шрифта метки таким образом, чтобы она как можно больше заполняла пользовательский элемент управления, сохраняя при этом весь текст в пределах этого элемента управления? Если да, то не укажет ли мне кто-нибудь на этот метод, пожалуйста?



Новый вопрос.

Есть идеи по размещению больших строк текста внутри маленьких коробочек, которые будут появляться в большом количестве на экране и в то же время выглядеть "красиво"?
желательно быстро кодировать.

Если я смогу понять, как размещать фотографии, я покажу вам, с чем я работаю.

Sergey Alexandrovich Kryukov

По-моему, это плохая идея. Почему? Если вы используете этот подход, размер шрифта будет зависеть от размера, который вы используете для экземпляра элемента управления, где вы его используете, но другие элементы управления ведут себя иначе.
—СА

3 Ответов

Рейтинг:
21

Sergey Alexandrovich Kryukov

Пожалуйста, смотрите мой комментарий к этому вопросу. Даже если вы реализуете желаемое поведение (что само по себе удивительно сложно из-за намеков на шрифт), вы можете столкнуться с очень неприятным стилистическим столкновением с другими элементами вашего пользовательского интерфейса.

Скорее, вам следует пересмотреть свой дизайн пользовательского интерфейса.

—СА


Mr.TMG

Я полностью согласен, что это больше хлопот, чем стоит, и займет больше времени, чем у меня. Сказав это, я обновляю свой вопрос, чтобы спросить совета.

Sergey Alexandrovich Kryukov

Мой ответ таков: почему бы не сделать наоборот: изменить размер родительского элемента управления, чтобы он хорошо вписывался в строку? В WPF это определяется системой свойств окна.Окна.Окна.SizeToContent. В разделе Формы см. раздел Система.Окна.Формы.TextRenderer.
—СА

Mr.TMG

Потому что размер родительского элемента управления определяется его окружением. Например: один из моих элементов управления отображает задачу - задача - это услуга, которая выполняется для элемента (образец). Образцы содержатся внутри Job. У меня есть окно, которое действует как всплывающее окно, как в поле со списком. Это всплывающее окно заполнено этими элементами управления, с которыми у меня возникли проблемы (Отображение задач). Сходное поле со списком действует так же, как поле со списком, но его текстовое поле заменяется меткой, в которой указано имя службы и количество задач, содержащихся во всплывающем окне. Затем размер двойника поля со списком изменяется в соответствии с длиной метки. Таким образом, поля отображения задач, содержащиеся в списке, имеют значительно меньше места.

Окно отображения задачи во всплывающем окне будет говорить что-то вроде
Искра OES на образце M13-235-01-а
где на этикетке combobox будет написано
Искровой ОЭС Х6

Конечно, я дал себе некоторое пространство для маневра, так что объем пространства, который у вас есть, на самом деле в 2 раза больше размера метки combobox в этом случае.

Элементы управления combobox заполняются горизонтально по всей рабочей строке (примерно размером с адресную строку вашего веб-браузера.

Строки задания заполняются вертикально в окне.

Кто-нибудь знает, как разместить здесь фотографию?

Mr.TMG

вот фотография https://skydrive.live.com/redir?resid=1A24B4A8C01B42BB!1177& v=3

Sergey Alexandrovich Kryukov

Ну и что? Вы все еще можете иметь все больше в соответствии с некоторым размером текста, и, когда общий размер достигает размера экрана, ввести прокрутку.

Во всяком случае, выбор шрифта-это худшее из возможных решений. Большие тексты не будут читаемы. В конце концов, почему бы не прокрутить? Это очень распространенная проблема, которая не может быть решена "идеально" по определению. Есть много конструкций, и уменьшение текста не используется. Или оставьте это пользователю.

Во всех случаях тщательно изучите свой дизайн. Мне кажется, что вы очень заняты своим нынешним замыслом. Я бы посоветовал вам преодолеть эту озабоченность. Вот как на самом деле решаются проблемы дизайна: выходя за рамки.

—СА

Mr.TMG

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

Sergey Alexandrovich Kryukov

Добро пожаловать.
Удачи, звоните еще.
—СА

Рейтинг:
2

Stephen Soper

Я получил эту работу без использования панели, просто ярлык. Я вызываю этот код, когда меняется текст или размер метки (у меня он установлен на якорь со всех сторон). В моем случае текст - это просто число, которое меняется каждую секунду для визуальных обновлений почти в реальном времени. Я надеюсь, что это поможет следующему человеку, задающемуся вопросом, как это делается:

Private Sub AdjustText()
    Dim Fit As Boolean = False
    Dim CurSize As Single
    Dim SizeStep As Single = 1
    Do Until Fit
        CurSize += SizeStep
        Dim Fnt As Font = New Font(lblQueue.Font.Name, CurSize)
        Dim textSize As Size = TextRenderer.MeasureText(lblQueue.Text, Fnt)
          If textSize.Height >= lblQueue.Height Or textSize.Width >= lblQueue.Width Or lblQueue.Height = 0 Or lblQueue.Width = 0 Then
            Fit = True
            If textSize.Width > lblQueue.Width Then
                CurSize -= SizeStep
            End If
            If textSize.Height > lblQueue.Height Then
                CurSize -= SizeStep
            End If
        End If
    Loop

    If CurSize >= 0 Then
        lblQueue.Font = New Font(lblQueue.Font.Name, CurSize)
        Application.DoEvents()
    End If
End Sub


Рейтинг:
18

Dave Kreskowiak

Итак, вы хотите, чтобы шрифт изменил свой размер, чтобы соответствовать строке в метке?? Этого метода не существует. Вам придется кодировать это самостоятельно.

Я сделал это (давным-давно!), создав свой собственный элемент управления, унаследованный от Panel, а не Label, и сам нарисовав текст.

Вам нужно будет использовать MeasureString[^] и параметры StringFormat, чтобы сказать вам, насколько велик ящик, который может содержать нарисованную строку. Размер шрифта, который вы передаете в MeasureString, будет фиксированным и никогда не изменится. В моем коде, по-моему, я использовал примерно 72 пункта.

Затем вы берете возвращаемый размер и создаете с ним растровое изображение, а затем рисуете свою строку в растровом изображении, используя те же параметры, которые вы передали MeasureString. Когда вы рисуете текст, нарисуйте растровое изображение (а не строку!) на контрольной поверхности и уменьшите его до нужного размера. Поскольку теперь вы рисуете изображение своего текста и уменьшаете его масштаб, это, конечно, разрушит красивые сглаженные края нарисованных глифов.


Mr.TMG

Ай... я признаю, что это звучит как определенное решение, и, вероятно, однажды попробую это сделать просто ради того, чтобы сделать это. Орехов, хотя бы не на моем текущем проекте. Спасибо за информацию.

Sergey Alexandrovich Kryukov

Я согласен и проголосовал 5, но с некоторыми примечаниями:
Я использовал MeasureString, но он заведомо неточен, что объясняется такими сложностями, как намек на шрифт.
Есть более точный метод измерения, который я нашел на каком-то форуме, но я обнаружил, что он также не был точен на 100%. Во всех случаях фактический размер строки может быть немного больше найденного. Поэтому мне пришлось добавить некоторое дополнительное поле вокруг строки, что не является 100% надежным подходом.
—СА

Dave Kreskowiak

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

Теперь, если бы я только мог найти код, который я использовал тогда.... ;)

Sergey Alexandrovich Kryukov

Я также не уверен, смогу ли найти исходный код или ссылку...
—СА