根据DPI调整WPF窗口大小

时间:2019-03-05 05:14:54

标签: c# wpf uwp scaling

我正在使用WPF应用程序,窗口尺寸为1200 * 932,包括标题栏。

它在我的台式机显示器(2560 * 1440,缩放比例为125%)上显示良好,实际尺寸为1500 * 1165。

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

如何处理?我是说动态的?

编辑:

原始问题可能不清楚。抱歉。

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

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

为什么不使用UWP:我发现UWP在某种沙箱内运行。对网络有一些限制,这对我的应用程序很重要。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您误会的是正在使用的单元。 当设置容器的宽度时,您不会告诉他容器的宽度正好是500像素。当您开始考虑字体时,这完全有意义。字体大小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英寸)

     

英寸为英寸; 1in == 96px

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

     

pt是点; 1pt ==(96/72)px

     

自动启用自动调整大小的行为。请参阅备注。

答案 2 :(得分: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
        }
    }

尽管可以,但是我认为它可能会导致诸如模糊或混叠之类的不良影响。我认为应该有内置的功能或某些功能可以满足此要求。