Рейтинг:
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
Я также не уверен, смогу ли найти исходный код или ссылку...
—СА