Выше я прокомментировал, что у меня была такая же проблема, и с тех пор я ее решил. Я пишу здесь свои изменения для всех остальных.
Как отмечалось выше, такое поведение возникает всякий раз, когда используется масштабирование пользовательского интерфейса Windows в приложении WinForms, а компилятор Just In Time (JIT) обрабатывает что-либо из библиотек WPF. В моем случае это произойдет, если ввести метод, содержащий код, открывающий WPF-версию MessageBox. Обычно Windows выполняет базовое масштабирование за вас, визуализируя растровое изображение за пределами экрана, а затем отрисовывая его на экране, но в увеличенном масштабе. Когда WPF загружается, кажется, что он берет верх, как будто он говорит Windows: «Эй ... я понял ...». После этого Windows перестает масштабировать WinForms для вас, и вы получаете версию с масштабированием 1x и часто некоторые запутанные элементы управления. Однако часть WPF обрабатывает собственное масштабирование и выглядит нормально.
Я решил это решить, сказав Windows, что я буду обрабатывать масштабирование WinForms. Чтобы включить это, вы должны добавить это в свой манифест приложения (манифест dll игнорируется)
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
ИЛИ раскомментируйте следующий раздел, если он там уже есть:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
Вы можете добавить файл манифеста:
Right click on application project -> Add -> New item... -> Application Manifest File
Затем в...
Application Project -> Properties -> Application -> Resources
Убедитесь, что для параметра "Манифест" установлено значение app.manifest
.
Теперь вы можете найти этот файл и добавить указанный выше XML в корневой <asmv1:assembly>
element.
Если вы взяли манифест приложения по умолчанию и добавили этот элемент, он, вероятно, будет выглядеть примерно так
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</asmv1:assembly>
Теперь, когда вы запустите приложение WinForms, вы заметите, что оно намного четче, потому что оно отображается с высоким dpi вместо 96 dpi, а затем масштабируется, чтобы заполнить пространство.
Вы, вероятно, заметите, что многие ваши изображения сжались !! В моем случае кнопки, MenuStripItems и ToolStripItems не масштабировались должным образом.
Я обнаружил, что у большинства элементов управления есть метод, который вы можете переопределить, как показано ниже.
protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
base.ScaleControl(factor, specified);
}
Это вызывается, когда приложение запускается и фильтрует ваши элементы управления из основной формы. Моя Windows установлена на 200%, режим масштабирования моей основной формы был установлен на DPI, и все формы были разработаны в масштабе 100% (96 dpi). Я изменил все в своих первых попытках исправить проблему, чтобы унаследовать режим масштабирования, и это было то, что у меня сработало, если вы используете шрифт или нет, я подозреваю, что он будет работать точно так же, но я не пробовал.
Поскольку у меня было 200% масштабирования пользовательского интерфейса, когда этот метод назывался factor
был просто {2.0, 2.0}, который я затем использовал для воссоздания масштабированного Image
в Button
s и для увеличения ImageScalingSize
на каждом из Items
MenuStrip
и ToolStrip
, поскольку они не получите вызов ScaleControl. Если вы никогда не добавляли приведенный выше XML, этот метод все равно вызывается, но всегда будет иметь только {1.0, 1.0} для фактора, что бесполезно. Примечание: если вы используете список изображений, тогда не устанавливайте изображение динамически, если в режиме DesignMode или ImageList будут отключены, а при сохранении ничего не будет установлено.
Также не тот фактор, который зависит от силы тока. Вы заметите, что если вы переместите приложение между разными мониторами с разрешением dpi, вы получите 2,0, затем 0,5, затем 2,0, затем 0,5 и т. Д.
Теперь мое приложение WinForms выглядит очень четким и может вызывать элементы пользовательского интерфейса WPF, не сходя с ума! yyayyyyy
Надеюсь, это кому-то поможет
person
dten
schedule
07.04.2015