You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI 3.0桌面应用如何实现禁用布局缩放的等效操作

WinUI 3.0桌面应用实现禁用布局缩放(等效UWP ApplicationViewScaling.TrySetDisableLayoutScaling(true))

UWP 中ApplicationViewScaling.TrySetDisableLayoutScaling(true)的核心作用是关闭XAML框架默认跟随系统DPI的自动布局缩放,让UI始终以100%比例做布局计算。WinUI 3桌面应用(含打包、未打包部署模式)没有提供同名API,可通过以下两步实现完全等效的效果:

  • 第一步:配置进程DPI感知模式
    要让自定义缩放因子生效,首先需要将进程DPI感知设置为Per Monitor V2模式,根据你的部署类型二选一配置即可:

    • 打包(MSIX)部署:打开Package.appxmanifest的代码编辑视图,在应用配置节点下添加PerMonitorV2的DPI感知声明
    • 未打包部署:可以直接在项目中添加应用程序清单(app.manifest)开启PerMonitorV2 DPI感知;如果不想修改清单,也可以在进程入口Main方法的第一行通过P/Invoke调用Win32 API设置,对应代码如下:
      using System.Runtime.InteropServices;
      
      [DllImport("user32.dll", SetLastError = true)]
      static extern bool SetProcessDpiAwarenessContext(IntPtr dpiFlag);
      // PerMonitorV2模式对应的常量值
      static readonly IntPtr DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = new IntPtr(-4);
      
      // Main方法入口
      static void Main(string[] args)
      {
          // 第一行调用设置DPI感知
          SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
          global::WinRT.ComWrappersSupport.InitializeComWrappers();
          // 其余原有WinUI3启动逻辑
      }
      
  • 第二步:全局固定XAML缩放因子
    在App类的构造函数中,调用InitializeComponent方法之前,添加如下代码将XAML全局缩放因子固定为100%:

    public App()
    {
        // 固定XAML布局缩放比例为100%,禁用自动跟随系统DPI缩放
        this.Host.Content.ScaleFactor = 100;
        this.InitializeComponent();
    
        // 其余原有应用初始化逻辑
    }
    

注意:该配置必须在所有窗口创建、所有XAML元素加载之前执行,否则已经渲染的UI不会应用该设置,会出现布局错位、渲染模糊的问题。配置生效后为全局生效,后续新建窗口不需要重复设置,所有XAML元素的尺寸计算都会按照1:1的物理像素比例执行,和UWP对应API的效果完全一致。

内容的提问来源于stack exchange,提问作者user358186

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:16:01