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

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

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

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

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

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

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

Ответы [ 3 ]

11 голосов
/ 09 сентября 2008

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

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

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

4 голосов
/ 09 сентября 2008

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

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

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

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

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

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

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

4 голосов
/ 09 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...