WinForms 不同的 DPI 布局

     2023-03-06     272

关键词:

【中文标题】WinForms 不同的 DPI 布局【英文标题】:WinForms Different DPI Layouts 【发布时间】:2010-12-23 11:34:34 【问题描述】:

不知何故,通过 Visual Studio 和设计器创建的表单和控件能够根据 Windows 的当前 DPI/字体大小自行缩放。我的 UI 的一部分是一个选项卡控件,其中包含根据用户的选择生成的动态页面和标签/输入。创建这些时,它们使用看起来适合 96 DPI 的硬编码尺寸。

.Net 中是否有一种自动方式来获取这些生成的控件并执行与设计器生成的控件相同的大小调整?我想避免自己缩放控件,因为这是不易维护的旧代码。

【问题讨论】:

【参考方案1】:

嗯,通过迭代标签页的 Control 集合并将 Point 和 Size 属性乘以缩放因子,这在技术上很容易做到。但是,一旦您开始考虑 Dock 和 Anchor 属性,这将变得非常棘手。

到目前为止,最简单的方法是让 Form 类缩放机制为您完成这项工作。您需要将控件添加到标签页之前 Load 事件运行。在构造函数中执行此操作。

避免切换 DPI 设置以测试代码的痛苦的快速提示:将其添加到表单构造函数以调用重新缩放逻辑:

protected override void OnLoad(EventArgs e) 
    this.Font = new Font(this.Font.FontFamily, this.Font.Size * 120 / 96);
    base.OnLoad(e);

【讨论】:

@nobugz :假设有多种不同类型的标签页(每种类型都有不同的内部控件):这些是否可以预定义为 UserControls:以获得“表单类缩放机制”的相同好处所以:在运行时:如果用户创建了一个类型为#3 的新标签页:新标签页的控件集合设置为 UserControl3 停靠的新实例“填充”,它当然会调用 UserControl 的“加载”事件:在这种情况下,UserControl 是否也能正常缩放?谢谢, 是的,伸缩是由ContainerControl实现的。和 Form 一样,UserControl 也是从它派生而来的。 @nobuz 谢谢,我从您的回答中学到的信息,以及同样适用于 UserControls 的确认非常有价值!【参考方案2】:

您尝试过AutoScaleMode 属性吗?

【讨论】:

是的,AutoScaleMode 使我的其他控件可以完美缩放,但它似乎不会影响动态控件。我还模仿了设计人员在生成控件时使用的 Suspend/ResumeLayout 和 PerformLayout 调用。【参考方案3】:

我解决了同样的问题,在运行时根据需要创建了控件,方法是执行 Designer.cs 所做的:

void CreateRuntimePanel()

    //instantiate controls here...

    //suspend layouts
    //begin inits

    this.SuspendLayout();

    //set control properties here

    //before adding any control to form's Controls collection, do this
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

    //add controls to form's Controls collection here

    //resume layouts
    //end inits

    this.ResumeLayout(false);  

【讨论】:

TextRenderer:如何像在具有不同 Dpi 的机器上一样测量文本?

...6:08【问题描述】:我有一个由服务器端和客户端组成的C#WinForms应用程序。我使用TextRenderer.MeasureText(stringtext,Fontfont)方法 查看详情

wpf不同dpi下,窗口大小的处理(代码片段)

在设置桌面不同分辨率以及较大DPI下,窗口如何显示的问题。(此例中仅设置高度)前端:设置窗口内容自适应SizeToContent="WidthAndHeight"添加ViewBox--设置默认不拉伸Stretch="None",当DPI超大时如超过1920*1080p的175%(即win10默认不支持的... 查看详情

在 WinForms 中修改停靠布局

】在WinForms中修改停靠布局【英文标题】:ModifydockinglayoutinWinForms【发布时间】:2013-07-1021:05:01【问题描述】:我的表单上有一个SplitContainer,其Dock属性设置为Fill。它包含几个子控件,其中许多都附加了事件处理程序。后来我决... 查看详情

winforms界面控件初探:布局灵活让你灵感一现的tilecontrol

超乎你想象!WinFormsGridControl处理100万行数据到底有多快?WinForms界面控件初探:处理速度飞快的WinFormsDataGrid(1)WinForms界面控件初探:处理速度飞快的WinFormsDataGrid(2)WinForms界面控件初探:支持读写XLSx,XLS,CSV和TXT文件的Spreadshee... 查看详情

修饰符 + 不同的图表,Winforms

】修饰符+不同的图表,Winforms【英文标题】:modifier+differentchar,WinForms【发布时间】:2015-09-2309:45:33【问题描述】:假设我的应用程序由富文本框和一个按钮组成。我希望当用户在RTB中按下一个键时启用该按钮,但它不能是任何... 查看详情

为什么用户控制c#winforms的所有组件在ui编辑器和运行时都有不同的大小?

我有一些c#winforms项目。我在其中添加了一个带有一些标准组件的用户控件到拆分容器。这个用户控件在UI编辑器中看起来很好:这些元素在绝对布局中对齐。未使用对接,锚定值为默认值(顶部,左侧)。但是在运行时组件的... 查看详情

如何强制高 DPI 手机在引导程序中打开 xs 布局

】如何强制高DPI手机在引导程序中打开xs布局【英文标题】:HowtoforcehighDPImobilestoopenxslayoutinbootstrap【发布时间】:2014-07-2613:39:09【问题描述】:我正在使用Bootstrap3创建一个网站,但我的iPhone和其他移动设备无法识别移动(xs)媒体... 查看详情

Chrome 在低 DPI 和高 DPI 显示器上以不同方式重绘 div

】Chrome在低DPI和高DPI显示器上以不同方式重绘div【英文标题】:Chromerepaintsdivonscrolldifferentlyonlow-andhigh-DPIdisplays【发布时间】:2014-01-0710:23:46【问题描述】:我正在努力优化我的网络应用中的滚动性能,并在最新的Chrome(v31)上遇到... 查看详情

android屏幕适配

...f0c;我们需要修改的是dpi,而Android适配也是因为dp在dpi不同的设备上展示出了不同的效果,因此需要进行适配。与缩放无关的抽象像素sp(用于字体设置)3.适配方法1.修改dpi注意:Activity和Application中的DisplayMatrics都需要进... 查看详情

WinForms - VB.NET - 为两个不同的列表框传递与数据源相同的列表会产生问题

】WinForms-VB.NET-为两个不同的列表框传递与数据源相同的列表会产生问题【英文标题】:WinForms-VB.NET-PassingsamelistasDataSourcefortwodifferentlistboxescreateproblems【发布时间】:2010-12-3100:44:27【问题描述】:查看下面的简单代码:PublicClassFor... 查看详情

一句话知识:如何解决winform自动缩放产生的布局问题.

...上。那么那就很可能是因为WinForm的自动放缩功能。因为不同语言的系统使用不同的缺省字体,相同字体的系统也可能使用不同的DPI(字符的每英寸点数),传统的Win32程序在 查看详情

停靠面板布局

...panelslayout【发布时间】:2012-10-0408:48:35【问题描述】:在winforms中,我尝试设置4个停靠的面板:顶部、左侧、右侧和中间。但是当我停靠顶部并尝试将另一个面板停靠在左侧时,左侧面板覆盖了顶部面板..我在那里做错了吗?是... 查看详情

“调用线程无法访问此对象,因为不同的线程拥有它”在 C# winforms 中使用 LiveCharts 绘图库时出错

...调用线程无法访问此对象,因为不同的线程拥有它”在C#winforms中使用LiveCharts绘图库时出错【英文标题】:\'Thecallingthreadcannotaccessthisobjectbecauseadifferentthreadownsit\'errorusingLiveChartsplottinglibraryinC#winforms【发布时间】:2021-10-1010:28:21【... 查看详情

android中分辨率,dpi,dp与px对应关系

...理像素。在定义应用的UI时应始终使用dp单位,以确保在不同密度的屏幕上正常显示UI。大多数情况下,确保应用中的屏幕独立性很简单,只需以适当的密度独立像素(dp单位)或"wrap_content"指定所有布局尺寸值。系统然后... 查看详情

如何在 Windows 上测试不同 DPI/屏幕分辨率的 Qml/Quick UI?

】如何在Windows上测试不同DPI/屏幕分辨率的Qml/QuickUI?【英文标题】:HowtestQml/QuickUIondifferentDPI/screenresolutionontheWindows?【发布时间】:2019-08-2619:38:19【问题描述】:有人知道在Windows上针对不同DPI缩放和屏幕分辨率测试Qml/QuickUI的解... 查看详情

target-densitydpi=device-dpi会使其他ui插件布局变小

target-densitydpi=device-dpi会使其他ui插件布局变小东哥说:不用rem了,把meta改成这样<metaname="viewport"content="width=720,user-scalable=no,target-densitydpi=device-dpi">就可以直接上px...这句target-densitydpi=device-dpi是什么意思呢? 查看详情

[uwp]xaml中的响应式布局技术(代码片段)

...式布局技术响应式布局的概念是一个页面适配多个终端及不同分辨率。在针对特定屏幕宽度优化应用UI时,我们将此称为创建响应式设计。WPF设计之初响应式设计的概念并不流行,那时候大部分网页设计师都按着宽度960像素的标... 查看详情

android屏幕适配屏幕适配基础概念②(像素px与密度无关像素dip|像素px与密度无关像素dip在不同屏幕像素密度dpi下的换算关系)

...像素px与密度无关像素dip二、像素px与密度无关像素dip在不同屏幕像素密度dpi下的换算关系参考文档:设备兼容性概览屏幕兼容性概览支持不同的像素密度声明受限屏幕支持一、像素px与密度无关像素dippx是pixel缩写,表示像素;dip是De... 查看详情