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

Итак, я читал те рекомендации для Windows Vista, которые были связаны с другим вопросом, и они упомянули, что вы должны пережить переход на 120 DPI. Ну, я запускаю свою удобную виртуальную машину с установленным моим приложением, и что мы получим... AAAAGH!!! MASSIVE UI FAIL!

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

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

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

Основная проблема, похоже, сводится к следующим:

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

Ответ 1

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

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

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

Ответ 2

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

Во-первых, AutoScaleMode может быть вашим другом.

Ответ 3

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

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

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

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

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

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

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