根据DPI调整WPF窗口大小

问题描述 投票:-1回答:3

我正在开发一个窗口大小为1200 * 932的WPF应用程序,包括标题栏。

它在我的桌面显示器上显示良好(2560 * 1440,缩放率为125%),实际尺寸为1500 * 1165。

但是,当我在笔记本电脑上运行它(2736 * 1824,缩放比例为200%)时,实际尺寸为2400 * 1864,这太大了。

怎么办呢?我的意思是动态?

编辑:

最初的问题可能不明确。对不起。

我想要做的就是UWP应用程序的工作原理。在我的桌面上,UWP应用程序默认窗口大小为1500 * 1165(可能为1200 * 932 * 125%);在笔记本电脑上,窗口大小为2048 * 1600(可能是1024 * 800 * 200%)。

UWP默认提供该功能吗? WPF可以这样做吗?我想可能是编程方式。

为什么不是UWP:我发现UWP正在使用沙盒。网络有一些限制,这对我的应用程序很重要。

c# wpf uwp scaling
3个回答
0
投票

如果你想改变应用程序窗口的大小,只需使用以下链接:WPF window size和这个wpf-windows-overview#window-size

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
SizeToContent="WidthAndHeight">

但我认为你正在寻找在WPF应用程序中的DPi集成检查他的链接以获取更多信息

https://docs.microsoft.com/en-us/windows/desktop/hidpi/declaring-managed-apps-dpi-aware

tecniques-scaling-wpf-application


0
投票

您误解的是您正在使用的单位。设置容器的宽度时,你不会告诉他例如宽度恰好是500像素。当你开始考虑字体时,这很有意义。 Fontsize 25在您的显示器上会很好,但是4 k显示器可能是简约的小型且不可读的。要解决这个问题,您设置容器的标准单位是1/96英寸。您可以在以下引用中修改它:

https://docs.microsoft.com/de-de/dotnet/api/system.windows.frameworkelement.width?view=netframework-4.7.2

qualifiedDouble如上所述的double值,后跟以下单位声明字符串之一:px,in,cm,pt。

px(默认值)是与设备无关的单位(每单位1/96英寸)

in是英寸; 1英寸== 96PX

厘米是厘米; 1cm ==(96 / 2.54)px

pt是积分; 1pt ==(96/72)px

自动启用自动调整行为。见备注。


0
投票

最后我知道我想要什么。问题中的描述不清楚:(

我希望应用程序大小(窗口大小以及内容大小)根据屏幕分辨率和缩放进行调整,以便我的应用程序在第一次午餐时占用(几乎)相同的屏幕分区。永远不要变得太大,越过屏幕,也不要太小,看不清楚。

所以我让我的窗口HeightWidth绑定到

    public double ReSizeWidth
    {
        get
        {
            return ((float)SystemParameters.VirtualScreenWidth) * (1500f / 2560f); 
            // 1500f / 2560f is the percentage
        }
    }

    public double ReSizeHeight
    {
        get
        {
            return ReSizeWidth * 0.75f + 32;
            // keep the window aspect ratio
        }
    }

并将此添加到Grid以外的最外层

        <Grid.LayoutTransform>
            <ScaleTransform CenterX="0" 
                            CenterY="0" 
                            ScaleX="{Binding ElementName=myMainWindow, Path=ScaleValue}" 
                            ScaleY="{Binding ElementName=myXMainWindow, Path=ScaleValue}"/>
        </Grid.LayoutTransform>

代码背后

    public double ScaleValue
    {
        get
        {
            return ReSizeWidth / 1200;
            // 1200 is the design height
        }
    }

虽然它可以工作,但我认为它可能会导致一些不好的效果,如模糊或锯齿。我认为应该有一个内置功能或其他东西来实现这一目标。

© www.soinside.com 2019 - 2024. All rights reserved.