首页 > 解决方案 > 防止表单重新缩放自身 - DPI 意识

问题描述

在 Visual Studio 2017 中,添加了“DPI 感知”功能。通过此命令填充数据表时:

    Dim dt As DataTable = New DataTable
    da.Fill(dt) <---- This is the line where the rescaling occurs

在上面的行中,表单将自己重新调整为更小的尺寸,以匹配监视器为其在 Windows 中的 scale 属性设置的大小。我该如何防止这种情况?我不希望表单重新缩放和更改大小,而是保持原样。

注意:我知道您可以在“DPI 未知”状态下重新启动 Visual Studio,但即使在这种状态下,运行应用程序时也会出现上述问题。

标签: visual-studio-2017

解决方案


以下是解决此行为的方法:

  1. 在 Visual Studio 中,右键单击您的项目 > Add>New Item..
  2. Application.Manifest File从选项中选择。保留默认名称app.manifest。单击Add。这将为您的项目生成清单。(注意:默认情况下,您的应用程序不包含清单文件。
  3. 打开新创建的清单文件。一切都应该已经被填充。取消注释此部分(通过删除<!--之前和-->之后):

<application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiAware> </windowsSettings> </application>

  1. 保存清单文件并编译。您的表单将不再重新缩放。

完整的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
 <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
  <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
    <!-- UAC Manifest Options
         If you want to change the Windows User Account Control level replace the 
         requestedExecutionLevel node with one of the following.

    <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
    <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
    <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

        Specifying requestedExecutionLevel element will disable file and registry virtualization. 
        Remove this element if your application requires this virtualization for backwards
        compatibility.
    -->
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />
  </requestedPrivileges>
</security>
</trustInfo>

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
  <!-- A list of the Windows versions that this application has been tested on
       and is designed to work with. Uncomment the appropriate elements
       and Windows will automatically select the most compatible environment. -->

  <!-- Windows Vista -->
  <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->

  <!-- Windows 7 -->
  <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->

  <!-- Windows 8 -->
  <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->

  <!-- Windows 8.1 -->
  <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->

  <!-- Windows 10 -->
  <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->

</application>
</compatibility>

<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
   DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need 
   to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should 
   also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->

<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
  <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiAware>
</windowsSettings>
</application>


<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
<!--
<dependency>
<dependentAssembly>
  <assemblyIdentity
      type="win32"
      name="Microsoft.Windows.Common-Controls"
      version="6.0.0.0"
      processorArchitecture="*"
      publicKeyToken="6595b64144ccf1df"
      language="*"
    />
</dependentAssembly>
</dependency>
-->

</assembly>

推荐阅读