Расположение элементов управления, зависящее от шрифта

StackOverflow https://stackoverflow.com/questions/37306

Вопрос

Я бы хотел использовать Segoe UI 9 pt в Vista и Tahoma 8 pt в Windows XP / etc.(На самом деле, я бы согласился на Segoe UI для обоих, но у моих пользователей, вероятно, он не установлен.) Но, поскольку они совершенно разные, они действительно портят макет моих форм.Итак...есть ли хороший способ справиться с этим?

Пример:У меня есть Label, с некоторым пустым пространством посередине, в которое я помещаю NumericUpDown контроль.Если я использую пользовательский интерфейс Segoe, то NumericUpDown это примерно на 5 пикселей левее пустого места, по сравнению с тем, когда я использую Tahoma.Это такая боль.;Я не уверен, что здесь делать.

Итак, наиболее конкретно, мой вопрос был бы следующим:как я могу разместить элементы управления в середине пустого пространства в моем Labels (или CheckBoxes и т.д.)?В самом общем виде:есть ли хороший способ обрабатывать различные шрифты в Windows Forms?

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

Ответ аджряну, quick_dry:Ладно, ребята, вы поняли вопрос.Я предполагаю, что MeasureString может сработать, хотя мне было бы интересно продолжить изучение лучших способов решения этой проблемы.

Проблема с разделением элемента управления наиболее очевидна, скажем, при CheckBox.Там, если пользователь нажмет на "вторую половину" флажка (который был бы отдельным Label контроль, я полагаю), тот CheckBox не меняет состояния.

Это было полезно?

Решение

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

Если необходимо попытаться позиционировать в зависимости от размера шрифта, вы могли бы использовать Графики.Строка измерения("Строка перед обновлением", моя метка.Шрифт)

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


[редактировать] Вы можете обработать событие щелчка в части метки "вторая половина" и изменить состояние флажка для этого события.Хотя все это похоже на взлом.Какую проблему решает этот странный макет элемента управления?Зачем вам нужен символ "вверх-вниз" в середине этикетки?

Другие советы

Я поддерживаю использование TableLayoutPanel для однострочных встроенных элементов управления.

Я обычно устанавливаю для каждого столбца и первой строки значение AutoSize, а для свойства Dock каждого дочернего элемента управления задается значение Fill в конструкторе. Это заставляет горизонтальное расположение отображаться правильно. Чтобы расположить текстовую строку между метками / текстовыми полями, установите для свойства TextAlign значение MiddleLeft.

Если ваш текст переходит на следующую строку, нет простого решения. Лучше всего использовать Graphics.MeasureString / TextRenderer.MeasureText и некоторую причудливую логику переноса: (

Прежде всего, вы можете узнать, какую версию Windows вы используете, с помощью свойство OperatingSystem.Platform в системной библиотеке.

Во-вторых, возможно, что вы можете поместить настройки шрифта в файлы ресурсов и определить, какой файл ресурсов использовать, в зависимости от определенных условий (например, версия вашей операционной системы).

Лично я думаю, что было бы неплохо позволить вашему пользователю определять шрифты, которые они предпочитают, в отличие от шрифта, который вы хотите использовать.

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

Проблема заключается в том, чтобы определить расположение элементов управления? то есть вы знаете, что шрифты X и Y работают в OS A и B и задаете нужный вам макет с текстом, который вы используете в этих системах?

Метод MeasureString может помочь в разработке макета таким образом, чтобы вы не были привязаны к определенным шрифтам.

float textWidth = graphics.MeasureString (someString, someFont) .Width;

(сработает ли выравнивание текста? Возможно, я тоже неправильно понял проблему)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top