Могу ли я указать Visual Studio не изменять DPI проекта?

У меня есть проект, преобразованный из .NET 1.1 в 3.5, который разрабатывается в 2008 году.

Если я открою проект в Windows 7, он преобразует размер всего в размеры 120 точек на дюйм. Если я затем открою его с разрешением 96 dpi, он изменится обратно. Есть ли способ разработать, чтобы он хорошо выглядел в обоих случаях, и не, чтобы Visual Studio менял размеры при открытии в системе с другим DPI?

Этот вопрос, возможно, лучше сформулирован/дублирован здесь: настройка dpi визуального дизайнера студии

Или здесь: Visual Studio и проблема DPI

Чтобы было ясно, что я пытаюсь сделать, это предотвратить изменение размера элемента управления в дизайнере при использовании несколькими разработчиками с разными настройками DPI. Во всех случаях, когда я замечал эту проблему, я работал с проектом .NET 1 или .NET 2, который изначально был обновлен для использования Visual Studio 2008, а теперь — Visual Studio 2010.

Обновление (на случай, если кто-то захочет посоревноваться с @Ben за бонусные баллы): у меня есть форма, размеры которой корректно изменяются, но размер окна изменяется программно. Поскольку дизайнер не знает о размерах, размер окна изменяется неправильно, если разработчик, использующий другой DPI, касается формы. Есть ли способ обойти эту проблему, кроме как отказаться от масштабирования пользовательского интерфейса во время выполнения?

Например: у меня есть два объявленных размера для моего окна, которые работают правильно, если разработчики используют 120 dpi во время разработки:

private static Size smallSize = new Size(960, 500);
private static Size largeSize = new Size(960, 615);

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


person Kevin Stricker    schedule 02.11.2010    source источник
comment
Я не проверял, но есть режим совместимости в Windows 7 для приложений. Можно попробовать поковыряться в настройках.   -  person PradeepGB    schedule 02.11.2010


Ответы (2)


AutoScaleMode = AutoScaleMode.None;

См. также: ContainerControl.AutoScaleMode свойство

person Ben Voigt    schedule 12.07.2011
comment
Насколько я понимаю, этот параметр меняет способ изменения размера элементов управления в встроенном приложении. Я пытаюсь предотвратить изменение размера элемента управления в дизайнере при использовании несколькими разработчиками с разными настройками DPI. - person Kevin Stricker; 12.07.2011
comment
@mootinator: если вы по-прежнему хотите, чтобы поведение изменения размера во время выполнения (но если оно разрушает ваш макет во время разработки, это будет одинаково плохо во время выполнения), ряд разработчиков предпочитают перебирать коллекцию Controls в конструкторе (после вызова метода сгенерированный дизайнером код) и измените AutoSizeMode на желаемую настройку среды выполнения. Таким образом, он не будет виден дизайнеру, который, следовательно, не будет портить ваш макет. - person Ben Voigt; 12.07.2011
comment
Я думаю, вы указали мне правильное направление. Вероятно, я могу установить константу для того, в каком DPI были разработаны мои размеры, чтобы они работали правильно, и сравнить это с AutoScaleDimensions до того, как будет вызван PerformAutoScale, чтобы автоматически настроить мои размеры для разных экранов разработчика. Если нет простого способа сказать VS изменить мои размеры во время разработки. В любом случае, моя главная проблема определенно заключалась в том, чтобы думать о проблеме в обратном направлении. Спасибо. - person Kevin Stricker; 12.07.2011
comment
@mootinator: Пожалуйста. Вы также можете проверить галерею надстроек/расширений, чтобы узнать, сделал ли кто-нибудь плагин VS для решения этой проблемы, но, по крайней мере, циклический просмотр всех ваших элементов управления во время выполнения должен быть довольно простым. - person Ben Voigt; 12.07.2011

Поскольку недавно я столкнулся с той же проблемой, я хочу поделиться своим обходным путем.

Во-первых: СОХРАНИТЬ AutoScaleMode = Font! Это будет хорошо работать во время выполнения, чтобы сделать ваше приложение осведомленным о DPI. (Даже круто с учетом DPI для каждого монитора).

Однако дизайнер WinForms в Visual Studio фактически оценивает размеры шрифтов на основе системного DPI и, таким образом, изменяет масштаб всякий раз, когда считает это необходимым. В этом суть проблемы. Эта оценка инициируется, поскольку шрифты обычно указывают свой размер в «точках» (чтобы обеспечить независимый от DPI пользовательский интерфейс).

Мой обходной путь - изменить это во время разработки:

  • Установите в конструкторе форм: Font = MS Sans; 11px. Это в основном шрифт ОС по умолчанию, но указанный с размером в пикселях. Таким образом, никакого масштабирования во время разработки никогда не будет.
  • Теперь, чтобы вернуть адаптацию к высокому разрешению DPI во время выполнения, снова измените шрифт, чтобы использовать размеры, указанные в пункте. Например. Font = SystemFonts.Default. Хорошее место в Ctor сразу после InitializeComponents.

Я подробно описал свой обходной путь в своем блоге: http://www.sgrottel.de/?p=1581&lang=en

person Knowleech    schedule 22.12.2016