如何为 WPF 应用程序启用 DPI 感知并根据屏幕分辨率对其进行缩放

如何解决如何为 WPF 应用程序启用 DPI 感知并根据屏幕分辨率对其进行缩放

在日常生活中,我们必须处理许多不同类型的显示尺寸,它可能是移动的,也可能是 4k 显示器。屏幕分辨率因显示器而异。这里另一个重要的因素是 DPI(display per inch),它主要是 windows 中的一个缩放因子,但与屏幕分辨率有很大关系。

现在我举一个例子,假设我在全高清显示器上运行 Visual Studio 应用程序,分辨率为 1920x1080。假设我将显示分辨率从全高清 (1920x1080) 更改为 1366x768。之后,我在同一台显示器上再次运行 Visual Studio,我看到用户界面 (UI) 变大了一些,并且所有控件、文本、图标和按钮都根据当前显示器的 DPI 缩放和分辨率完美对齐。

当我们以较低分辨率运行 Visual Studio 和其他 Windows 应用程序时,UI 应该会变得更大。

我想在我的 WPF 应用程序中应用类似的效果,这样每次屏幕分辨率和 DPI 更改时,我的应用程序都会根据显示 DPI 和分辨率自动调整。我已经针对 Windows 10 尝试使用 Microsoft 每显示器 DPI 感知并编辑 app.Mainfest 文件并根据 GitHub 说明取消注释一些代码,但在我的情况下没有任何效果

我还将屏幕分辨率与我的应用程序高度和宽度绑定,但它覆盖了整个屏幕,我不想要那样。

但我理解的一件事是我必须获取系统 DPI,然后将其应用于我的窗口加载事件,但我不知道如何在代码中执行此操作。

这是 MainWindow.xaml 代码(我只放了一点代码,因为它是办公项目)

<Window
    x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfApp1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Name="myMainWindow"
    Title="MainWindow"
    Width="1024"
    Height="547.4"
    AllowsTransparency="True"
    WindowStartupLocation="CenterScreen"
    WindowStyle="None"
    MouseLeftButtonDown="myMainWindow_MouseLeftButtonDown"
    mc:Ignorable="d">
    <Grid Name="MainGrid" Background="#282828">
        <Button
            x:Name="BtnSettings"
            Width="71"
            Height="24"
            Margin="165,14,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            RenderOptions.BitmapScalingMode="NearestNeighbor"
            RenderOptions.ClearTypeHint="Enabled"
            SnapsToDevicePixels="True"
            UseLayoutRounding="True">
            <Button.Content>
                <TextBlock
                    Margin="0,-2,0"
                    FontFamily="Segoe UI"
                    FontSize="10"
                    TextOptions.textformattingMode="display"
                    UseLayoutRounding="True">
                    Settings
                </TextBlock>
            </Button.Content>
        </Button>
        <Button
            x:Name="BtnAccounts"
            Width="71"
            Height="24"
            Margin="237,0"
                    FontFamily="Segoe UI"
                    FontSize="10"
                    TextOptions.textformattingMode="display"
                    UseLayoutRounding="True">
                    Accounts
                </TextBlock>
            </Button.Content>
        </Button>
    </Grid>
</Window>

这是我的后端 c# 逻辑代码,称为 MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void myMainWindow_MouseLeftButtonDown(object sender,MouseButtonEventArgs e)
        {
            DragMove();
        }
    }
}

一个重要因素是我也使用视图框,但这并没有达到我想要的效果。有些人告诉我我应该使用流体布局,我应该使用 Grid.RowDeFinitions 和 Grid.ColumnDeFinitions,我还使用 * 和 Auto 来调整大小,不要使用绝对定位,而不是我应该使用边距和填充。我知道这是一个问题,但我的主要问题是 DPI 和分辨率,这与绝对定位无关。

我应该在 MainGrid 上使用缩放转换,并且应该与 DPI 装饰器和分辨率绑定,但我没有足够的想法来执行此操作。

正如我之前所说,视图框不起作用,因为我在我的应用程序中使用了 SEOge UI 字体,如果您仔细查看我的 MainWindow.xaml 代码,那么您会看到我提供了字体大小 = 10,因为后者占用了这个尺寸的形状很好,我还使用 TextOptions.textformattingMode="display" 用于我的 UI 设计目的。

我的问题是我的 WPF 应用程序如何自动检测屏幕 DPI 和分辨率并根据自身完美缩放变换,因此没有字体模糊问题或主窗口非常小等。 根据显示效果完美贴合、缩放和美观。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?