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启动逻辑 }
- 打包(MSIX)部署:打开
第二步:全局固定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
相关产品推荐
相关产品推荐

