【问题标题】:Adjust WPF window size based on DPI根据 DPI 调整 WPF 窗口大小
【发布时间】:2019-07-26 12:13:17
【问题描述】:

我正在开发一个窗口大小为 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 在沙盒中运行。网络有一些限制,这对我的应用很重要。

【问题讨论】:

  • 现在你的问题更不清楚了.. 至少对我来说我不能告诉 enaymore 你想要什么你想要一个帧总是完全相同的实际像素大小还是......?跨度>

标签: c# wpf uwp scaling


【解决方案1】:

如果您想更改应用程序窗口的大小,只需使用此链接: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

【讨论】:

    【解决方案2】:

    您误解的是您正在使用的单位。 在设置容器的宽度时,您不会告诉他其宽度正好是 500 像素。当您开始考虑字体时,这完全有道理。字体大小 25 在您的显示器上会很好,但如果是 4 k 显示器,它可能会显得极简且难以阅读。要解决这个问题,您将容器设置为 1/96 英寸的标准单位。您可以在以下引文中对其进行修改:

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

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

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

    in 是英寸; 1in==96px

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

    pt 是点; 1pt==(96/72) 像素

    Auto 启用自动调整大小的行为。见备注。

    【讨论】:

    • 谢谢。我知道设备无关像素的概念,但仍然不知道如何处理它。为了让问题更清楚,我已经编辑了问题。
    【解决方案3】:

    我终于知道我想要什么了。而且问题中的描述不清楚:(

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

    所以我让我的窗口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
            }
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 2014-10-10
      相关资源
      最近更新 更多