Пользовательский интерфейс, не зависящий от размера шрифта:все сломалось, когда я переключился на 120 точек на дюйм?

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

Вопрос

Итак, я читал те рекомендации по пользовательскому интерфейсу Windows Vista, на которые кто-то ссылался в другом вопросе, и в них упоминалось, что вы должны быть в состоянии пережить переход на 120 точек на дюйм.Что ж, я запускаю свою удобную виртуальную машину с установленным приложением, и что мы получаем?..ААААХ!!!МАССОВЫЙ СБОЙ пользовательского интерфейса!

Все так перепуталось:некоторые контейнеры недостаточно велики для размещения текста;некоторые элементы управления, которые были расположены "рядом друг с другом", теперь все сжаты вместе / раздвинуты;некоторые пуговицы недостаточно высокие;мой ListView колонки недостаточно широкие...ик.

Похоже, здесь нужен совершенно другой подход.Мой предыдущий проект был в основном основан на использовании конструктора Windows Forms VS2008 для создания, я полагаю, макета на основе пикселей.Я вижу, что если бы я придерживался Windows Forms, FlowLayoutPanels были бы полезны, хотя в прошлом я находил их довольно негибкими.Они также не решают проблему, когда контейнеры (напримерсама форма) недостаточно велики;предположительно, есть способ сделать это?Может быть, это AutoSize собственность?

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

Основная проблема, по-видимому, сводится к этим:

  • Если бы я придерживался Windows Forms, каковы все хитрости для достижения макета, не зависящего от размера шрифта, который может выдержать установку пользователем больших шрифтов или настройку дисплея на 120 точек на дюйм?
  • Есть ли у WPF здесь существенные преимущества, и если да, можете ли вы попытаться убедить меня, что стоит переключиться?
  • Существуют ли какие-либо общие "рекомендации" для макетов, не зависящих от размера шрифта, либо в стеке .NET, либо в целом?
Это было полезно?

Решение

Узнайте, как Якорь и Док свойства работают с вашими элементами управления, оставьте все, что может Автоматический размер сам по себе, и использовать TableLayoutPanel когда сможешь.

Если вы выполните эти три действия, вы получите большой опыт проектирования WPF в Windows Forms.Хорошо продуманный TableLayoutPanel сделает все возможное, чтобы размер элементов управления соответствовал форме должным образом.В сочетании с Автоматический размер управление, стыковка и Режим автоматического масштабирования по словам Соерена Куклау, вы должны уметь делать что-то, что хорошо масштабируется.Если нет, то в вашей форме может быть просто слишком много элементов управления;рассмотрите возможность разделения его на страницы вкладок, плавающие панели инструментов или какое-либо другое пространство.

В WPF это намного проще, потому что концепция элементов управления автоматической калибровкой встроена;в большинстве случаев, если вы размещаете элемент WPF с помощью пары координат, вы делаете это неправильно.Тем не менее, вы не можете изменить тот факт, что при более низких разрешениях не требуется большого количества текста с разрешением 120 точек на дюйм, чтобы заполнить экран.Иногда проблема заключается не в вашей планировке, а в попытке вместить слишком много в маленькое пространство.

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

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

Для одного, Режим автоматического масштабирования может быть, это твой друг.

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

Вы используете пиксели для объектов вашей формы и точки (в основном дюймы) для указания размера шрифта.Пиксели и точки связаны по DPI, поэтому вы меняете DPI, и внезапно ваши фиксированные значения пикселей не совпадают с вашими фиксированными значениями точек.

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

Лично я бы изменил значения в форме на дюймы.Я не специалист по C #, поэтому я не знаю, поддерживается ли это изначально, или вам нужно выполнить какое-то динамическое изменение размера формы при запуске приложения.

Если вам нужно сделать это в вашем программном обеспечении, тогда продолжайте и увеличьте все в обычном размере (скажем, до ваших обычных 96 точек на дюйм).

Когда ваше приложение запустится, убедитесь, что разрешение системы составляет 96 точек на дюйм, прежде чем показывать свои формы.Если это так, то отлично.Если нет, то задайте переменную с поправочным коэффициентом, а также масштабируйте и преобразуйте (измените как местоположение, так и размер) каждый объект перед отображением формы.

В конечном итоге, однако, было бы указать все в дюймах или точках (точка равна 1/72 дюйма) и позволить операционной системе справиться с этим.Возможно, вам придется иметь дело с угловыми корпусами (наружный экран с правильно установленным разрешением на дюйм будет отображать ваше приложение в нескольких пикселях ...)

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