日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# 中 WinForm 窗體利用Dock和Anchor實(shí)現(xiàn)自動(dòng)縮放與自適應(yīng)布局

admin
2025年4月11日 22:41 本文熱度 198

前言

在桌面應(yīng)用開(kāi)發(fā)中,界面適配一直是用戶體驗(yàn)優(yōu)化的核心挑戰(zhàn)之一。尤其在多分辨率顯示器普及、高DPI設(shè)備廣泛應(yīng)用的今天,如何讓 WinForm 窗體在不同環(huán)境下保持布局穩(wěn)定、控件比例協(xié)調(diào),成為大多數(shù)人需解決的問(wèn)題。

傳統(tǒng)的固定像素布局在面對(duì)屏幕縮放或分辨率切換時(shí),往往導(dǎo)致界面錯(cuò)位、字體模糊甚至控件溢出,嚴(yán)重影響用戶操作效率與視覺(jué)體驗(yàn)。眾所周知,WinForm 采用基于像素的布局模型,因此原生的 WinForm 對(duì)于窗體自適應(yīng)支持并不理想。

本文將分享如何利用 C# 和 WinForm 的特性來(lái)實(shí)現(xiàn)窗體的自動(dòng)縮放與自適應(yīng)布局,確保應(yīng)用程序在不同分辨率和屏幕尺寸下都能提供一致且優(yōu)質(zhì)的用戶體驗(yàn)。

界面布局

當(dāng)我們想要實(shí)現(xiàn)窗體自適應(yīng)的時(shí)候,優(yōu)先要通過(guò)界面布局設(shè)置好窗體和控件的一些屬性:

1、Anchor:用于固定控件的邊緣到窗體的邊緣,當(dāng)窗體大小改變時(shí),控件的位置也會(huì)相應(yīng)改變。

2、Dock:用于將控件停靠到窗體的邊緣,控件的大小會(huì)隨著窗體邊緣的改變而改變。

3、布局控件:使用TableLayoutPanel 或 FlowLayoutPanel等布局控件可以更好地管理控件的布局,它們可以自動(dòng)調(diào)整大小和位置。

4、Padding:Padding屬性定義控件內(nèi)部的一段空間,用于將控件的內(nèi)容保持在距控件邊框一定的距離。

5、Margin:Margin屬性定義控件周?chē)目臻g,該空間使其他控件與控件的邊框保持指定距離。

代碼實(shí)現(xiàn)

除了以上方法外,在實(shí)際應(yīng)用中,我們更多會(huì)使用通過(guò)代碼來(lái)手動(dòng)調(diào)整窗體和控件的大小和位置,這種方法第一次寫(xiě)的時(shí)候會(huì)麻煩一些,但是封裝好之后,后續(xù)應(yīng)用也比較簡(jiǎn)單。

1、創(chuàng)建 FormAutoSize 類(lèi)及初始化字段

為了更好地管理窗體的自動(dòng)縮放和自適應(yīng)布局,可以創(chuàng)建一個(gè)名為 FormAutoSize 的類(lèi),并在其中定義三個(gè)字段:窗體寬度、高度和窗體對(duì)象。


public class FormAutoSize
{
    //窗體對(duì)象
    private Form form;
    //定義當(dāng)前窗體的寬度
    private float width; 
    //定義當(dāng)前窗體的高度
    private float height; 
}

2、FormAutoSize 類(lèi)的構(gòu)造方法中初始化字段并存儲(chǔ)控件屬性

初始化字段

InitialWidth 和 InitialHeight 分別存儲(chǔ)窗體的初始寬度和高度。

TargetForm 存儲(chǔ)當(dāng)前要進(jìn)行自適應(yīng)處理的窗體對(duì)象。

存儲(chǔ)控件屬性

在構(gòu)造方法中,遍歷窗體上的所有控件。

將每個(gè)控件的寬度、高度、左邊距、上邊距以及字體大小按分號(hào)拼接成一個(gè)字符串,并存儲(chǔ)到該控件的 AccessibleDescription 屬性中。

使用 AccessibleDescription 屬性

AccessibleDescription 是一個(gè)較少使用的屬性,適合用來(lái)存儲(chǔ)臨時(shí)或自定義的數(shù)據(jù),而不會(huì)影響控件的正常功能。

通過(guò)這種方式,我們可以方便地在后續(xù)操作中讀取和應(yīng)用這些存儲(chǔ)的屬性值,實(shí)現(xiàn)窗體及其控件的自動(dòng)縮放和自適應(yīng)布局。


private void SetDescription(Control cons)
{
    foreach (Control ctl in cons.Controls)
    {
        ctl.AccessibleDescription = 
        ctl.Width + ";"
        + ctl.Height + ";"
        + ctl.Left +
        ";" + ctl.Top + ";"
         + ctl.Font.Size;
        //遞歸
        if (ctl.Controls.Count > 0)
        {
            SetDescription(ctl);
        }
    }
}

3、通過(guò)比例系數(shù)重置窗體控件布局

為了實(shí)現(xiàn)窗體及其控件的自動(dòng)縮放和自適應(yīng)布局,我們需要根據(jù)當(dāng)前窗體的寬度和高度與初始寬度和高度的比例,計(jì)算出比例系數(shù) scaleX 和 scaleY。

然后使用這些比例系數(shù)調(diào)整每個(gè)控件的寬度、高度、左邊距、上邊距以及字體大小,并重新設(shè)置這些屬性。


private void SetControls(float scaleX, float scaleY, Control cons)
{
    //遍歷窗體中的控件,重新設(shè)置控件的值
    foreach (Control con in cons.Controls)
    {
        //獲取控件的AccessibleDescription屬性值,并分割后存儲(chǔ)字符串?dāng)?shù)組
        if (con.AccessibleDescription != null)
        {
            var tag = con.AccessibleDescription.ToString().Split(';');
           
           //根據(jù)窗體縮放的比例確定控件的值
            con.Width = 
            Convert.ToInt32(Convert.ToSingle(tag[0]) * scaleX); 
            //寬度
            con.Height = 
            Convert.ToInt32(Convert.ToSingle(tag[1])* scaleY); 
            //高度
            con.Left = 
            Convert.ToInt32(Convert.ToSingle(tag[2]) * scaleX); 
            //左邊距
            con.Top = 
            Convert.ToInt32(Convert.ToSingle(tag[3]) * scaleY); 
            //頂邊距
            var currentSize =
            Convert.ToSingle(tag[4]) * scaleY; 
            
            //字體大小                   
            if (currentSize > 0)
            {
                con.Font = new Font(con.Font.Name, 
                currentSize, con.Font.Style, con.Font.Unit);
            }
            con.Focus();
            if (con.Controls.Count > 0)
            {
                SetControls(scaleX, scaleY, con);
            }
        }
    }
}

4、窗體中調(diào)用 FormAutoSize 實(shí)現(xiàn)自動(dòng)縮放

定義 FormAutoSize 對(duì)象

在需要進(jìn)行縮放的窗體類(lèi)(如 MainForm)中定義一個(gè) FormAutoSize 對(duì)象 formAutoSize。

實(shí)例化 FormAutoSize 對(duì)象

在窗體的構(gòu)造方法 MainForm() 中實(shí)例化 FormAutoSize 對(duì)象,并將當(dāng)前窗體 this 以及初始寬度和高度作為參數(shù)傳遞進(jìn)去。

訂閱 SizeChanged 事件

在窗體的 InitializeComponent 方法中訂閱窗體的 SizeChanged 事件,以便在窗體大小發(fā)生變化時(shí)能夠調(diào)用 AdjustControlsLayout 方法。

調(diào)用 AdjustControlsLayout 方法

在 MainForm_SizeChanged 方法中調(diào)用 formAutoSize.AdjustControlsLayout(),以根據(jù)新的窗體尺寸動(dòng)態(tài)調(diào)整控件布局。

通過(guò)這種方式,我們可以確保窗體及其控件在不同的屏幕分辨率和窗口大小下都能保持良好的顯示效果和用戶體驗(yàn)。

5、運(yùn)行效果

縮放前尺寸:1280*720

?

縮放后尺寸:1420*827

總結(jié)

通過(guò)以上步驟,我們可以在 WinForm 應(yīng)用中實(shí)現(xiàn)窗體及其控件的自動(dòng)縮放和自適應(yīng)布局,從而確保應(yīng)用程序在不同分辨率和屏幕尺寸下都能提供一致且優(yōu)質(zhì)的用戶體驗(yàn)。


?閱讀原文:原文鏈接


該文章在 2025/4/12 16:41:22 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 亚洲成a人v欧 | 国产一区二区三区在线啊 | 九九热精品在线视频观看 | 欧美日韩综合在线视频免费看 | 亚洲午夜成 | 中文字幕丰满伦孑 | 青青草免费观看 | 中文字幕亚洲 | 国产女人喷潮视频在线观看 | 日本激情夜里视频在线观看 | 欧洲尺码日本尺码专线 | 无人影院手机版在线观看免费 | 最近日本韩国高清免费大全 | 日韩亚射亚洲国产第一 | 中文字幕日本有码视频在线 | 亚洲国产日韩不卡线欧美 | 精品国产制服丝袜高跟 | 日本一区二区三 | 免费无人区一码二码乱码区别在哪 | 国产精品免费精品自在线观看 | 漂亮的保姆6 | 天堂在线最新版资源 | www在线观看一区二区三区 | 国产一级大片在线观看 | 国产尹人香蕉在线观看 | 妺妺窝人体色www聚色窝仙踪 | 日韩视频中文字幕视频一区 | 欧美日韩中文字幕在线看 | 国产v在线在线观看视频免费 | 日本中文字幕在线播放第1页 | 在线网站| 亚洲综合色一区二区三区 | 狼天天狼天天香蕉综 | 日韩熟女高清精品专区 | 亚洲欧美另类在线观看一区二区 | 成人欧美一区二区三区的电影 | 国产精品自产拍在线观看花钱看 | 国产自产一区二区三区视频在线 | 午夜电影国产精品一区 | 亚洲激情一区二区 | 国产偷窥女洗浴在线观看亚洲 |