[英]WPF ClickOnce DPI awareness Per-Monitor v2
我將設置此問題並親自回答,以便其他人可以輕松地搜索並找到正確的答案。 我不得不谷歌搜索幾個小時,並從多個來源匯編最終結果...
因此,問題是- 如何在ClickOnce場景(特別是WPF,特別是c#)中啟用Per-Monitor v2 DPI感知?
在Win 10 Creators Update(1703)中添加了Per-monitor v2。 眾所周知,ClickOnce不支持在app.manifest文件中聲明的DPI感知, 例如 。
首先,任何想大聲疾呼的人-只需針對每個監視器目標.NET 4.6.2,默認情況下就會啟用DPI感知-這是不對的。
.NET 4.6.2中默認情況下啟用的是幕后的樣板代碼-窗口聲明代碼中非常討厭的c ++鈎子,以支持對每個顯示器的dpi感知。
您仍然必須通過app.manifest聲明您支持每個顯示器的dpi感知,但ClickOnce不支持。
(請注意,除非您手動添加樣板代碼 ,否則即使使用應用程序清單,.NET的早期版本也不支持每個監視器的dpi意識)
現在來回答:
[assembly: DisableDpiAwareness]
。 (這需要using System.Windows.Media;
語句,只需單擊將鼠標懸停在紅色波浪線上方時出現的燈泡,然后添加建議的using語句即可) 現在,您將在項目中的某處需要以下c#代碼,我建議為此創建一個新的靜態類:
internal static class NativeMethods { [DllImport("user32.dll", SetLastError = true)] internal static extern bool SetProcessDpiAwarenessContext(int dpiFlag); [DllImport("SHCore.dll", SetLastError = true)] internal static extern bool SetProcessDpiAwareness(PROCESS_DPI_AWARENESS awareness); [DllImport("user32.dll")] internal static extern bool SetProcessDPIAware(); internal enum PROCESS_DPI_AWARENESS { Process_DPI_Unaware = 0, Process_System_DPI_Aware = 1, Process_Per_Monitor_DPI_Aware = 2 } internal enum DPI_AWARENESS_CONTEXT { DPI_AWARENESS_CONTEXT_UNAWARE = 16, DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = 17, DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = 18, DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = 34 } }
最后一部分是調用上述p / invoke方法並聲明dpi感知支持。 我們需要在運行任何其他代碼之前執行此操作。 為此,在SolutionExplorer中右鍵單擊app.xaml ,然后選擇View Code
。 然后添加以下代碼:
protected override void OnStartup(StartupEventArgs e) { if (Environment.OSVersion.Version >= new Version(6, 3, 0)) // win 8.1 added support for per monitor dpi { if (Environment.OSVersion.Version >= new Version(10, 0, 15063)) // win 10 creators update added support for per monitor v2 { NativeMethods.SetProcessDpiAwarenessContext((int)NativeMethods.DPI_AWARENESS_CONTEXT.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); } else NativeMethods.SetProcessDpiAwareness(NativeMethods.PROCESS_DPI_AWARENESS.Process_Per_Monitor_DPI_Aware); } else NativeMethods.SetProcessDPIAware(); base.OnStartup(e); }
確保其余代碼可以正確處理DPI。 從.NET 4.6.2開始,可以使用OnDpiChanged
事件和VisualTreeHelper.GetDpi()
方法。
請享用 :)
@Marko-好答案! 但這是一個小細節:如果將WinForms與WPF混合使用,則必須添加WinForms配置。 請更新您的答案,我沒有足夠的意思發表評論...
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
推薦人: https ://docs.microsoft.com/en-us/dotnet/framework/winforms/high-dpi-support-in-windows-forms
在app.manifest中聲明的DPI感知被稱為 .NET 4.7.2功能之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.