亚洲必赢手机入口WinForm响应式布局规划执行。WinForm响应式布局设计执行。

by admin on 2018年10月5日

引言

缔造响应式WinForm应用程序并无那么简单。
响应式布局,在斯我指的是应用程序在不同屏幕分辨率下的可用性。
对于WinForm应用程序,我们要明白地冲分辨率来调动控件的深浅及更定位。
虽然以用WPF时产生相关的施行使,通过利用控件的docking和anchoring,或采用panels等办法,但本文提供了扳平栽将响应式应用于WinForm应用程序的差方法。

引言

创办响应式WinForm应用程序并无那么简单。
响应式布局,在斯我因的凡应用程序在不同屏幕分辨率下之可用性。
对于WinForm应用程序,我们得鲜明地冲分辨率来调动控件的尺寸与重定位。
虽然当使WPF时出连带的行使,通过动用控件的docking和anchoring,或使panels等方法,但本文提供了同种将响应式应用于WinForm应用程序的例外方式。

背景

自身当一个要好设计之概括打被遇了问题:我计划了平台分辨率为1920×1080的机器,
但是当自身准备在笔记本电脑上播报时,发现应用程序边界跑至屏幕外。由此大有必要为程序来适应不同分辨率的设施,而休是于用户来适应程序。
因此,我本着代码进行了改善。

背景

自己在一个和好规划之简练打受碰到了问题:我计划了千篇一律高分辨率为1920×1080底机器,
但是当自己准备以笔记本电脑上播报时,发现应用程序边界跑至屏幕外。由此大有必不可少让程序来适应不同分辨率的设施,而不是为用户来适应程序。
因此,我本着代码进行了改良。

技术

其实没什么技术可言,只是用了一个不怎么技巧。我们所以半独常量来保存设计时之屏幕分辨率,我们称为设计时分辨率。这样,无论何时运行应用程序,它还见面收获一个乘法因子,这实质上是一个比例因子,通过以手上分辨率除以设计时分辨率来博取该因子。
窗体的备控件都叫传送让这类似对象开展缩放和调整大小。

技术

事实上没什么技术可言,只是用了一个略带技巧。我们因而简单只常量来保存设计时的屏幕分辨率,我们称为设计时分辨率。这样,无论何时运行应用程序,它还见面落一个乘法因子,这事实上是一个比例因子,通过将手上分辨率除以设计时分辨率来取得该因子。
窗体的持有控件都受传送给这仿佛对象进行缩放和调动大小。

代码

代码

The Responsive Class – Responsive.cs

创办一个类Responsive.cs,添加5单变量。

float WIDTH_AT_DESIGN_TIME = (float)Convert.ToDouble
                             (ConfigurationManager.AppSettings["DESIGN_TIME_SCREEN_WIDTH"]);
float HEIGHT_AT_DESIGN_TIME = (float)Convert.ToDouble
                              (ConfigurationManager.AppSettings["DESIGN_TIME_SCREEN_HEIGHT"]);
Rectangle Resolution;
float WidthMultiplicationFactor;
float HeightMultiplicationFactor;

设计时屏幕分辨率保存在App.config文件中。

<add key ="DESIGN_TIME_SCREEN_WIDTH" value="1920"/>
<add key ="DESIGN_TIME_SCREEN_HEIGHT" value="1080"/>

当类的一个实例被创造时,当前的辨析为提供被构造函数。
之后调用该类的SetMultiplicationFactor()方法。
这种办法通过将手上分辨率除以设计日分辨率来获得缩放因子。

public Responsive(Rectangle ResolutionParam)
{
    Resolution = ResolutionParam;
}

public void SetMultiplicationFactor()
{
    WidthMultiplicationFactor = Resolution.Width / WIDTH_AT_DESIGN_TIME;
    HeightMultiplicationFactor = Resolution.Height / HEIGHT_AT_DESIGN_TIME;
}

比如说,该应用程序设计在1920×1080分辨率。
如果这个应用程序在分辨率为1024×768底微机及运行,则WidthMultiplicationFactor和HeightMultiplicationFactor更改如下:

WidthMultiplicationFactor = 1024/1920 = 0.533
HeightMultiplicationFactor = 768/1080 = 0.711

最后出点儿栽重载方法,它们啊应用程序控件提供响应式解决方案(最佳大小,位置及字体大小)的终极方法。

public int GetMetrics(int ComponentValue)
{
    return (int)(Math.Floor(ComponentValue * WidthMultiplicationFactor));
}

public int GetMetrics(int ComponentValue, string Direction)
{
    if (Direction.Equals("Width") || Direction.Equals("Left"))
        return (int)(Math.Floor(ComponentValue * WidthMultiplicationFactor));
    else if (Direction.Equals("Height") || Direction.Equals("Top"))
        return (int)(Math.Floor(ComponentValue * HeightMultiplicationFactor));
    return 1;
}

例如,如果在宽度=465,高度=72,左=366,顶部=41以及字体大小=40底控件,则该法返回建议的高低,位置和字体大小为:

Width = 465 * 0.533 = 248
Height = 72 * 0.711= 51
Left = 366 * 0.533= 195
Top = 41 * 0.711= 29
Font-size = 40 * 0.533 = 21

骨子里,这些措施返回缩放的控件与大小、位置和字体大小,而这些价值是展示的尽佳值。

The Responsive Class – Responsive.cs

创造一个类Responsive.cs,添加5只变量。

float WIDTH_AT_DESIGN_TIME = (float)Convert.ToDouble
                             (ConfigurationManager.AppSettings["DESIGN_TIME_SCREEN_WIDTH"]);
float HEIGHT_AT_DESIGN_TIME = (float)Convert.ToDouble
                              (ConfigurationManager.AppSettings["DESIGN_TIME_SCREEN_HEIGHT"]);
Rectangle Resolution;
float WidthMultiplicationFactor;
float HeightMultiplicationFactor;

统筹时屏幕分辨率保存在App.config文件被。

<add key ="DESIGN_TIME_SCREEN_WIDTH" value="1920"/>
<add key ="DESIGN_TIME_SCREEN_HEIGHT" value="1080"/>

当类的一个实例被创造时,当前底分析被提供被构造函数。
之后调用该类的SetMultiplicationFactor()方法。
这种措施通过将目前分辨率除以设计日分辨率来博缩放因子。

public Responsive(Rectangle ResolutionParam)
{
    Resolution = ResolutionParam;
}

public void SetMultiplicationFactor()
{
    WidthMultiplicationFactor = Resolution.Width / WIDTH_AT_DESIGN_TIME;
    HeightMultiplicationFactor = Resolution.Height / HEIGHT_AT_DESIGN_TIME;
}

如,该应用程序设计于1920×1080分辨率。
如果这应用程序在分辨率为1024×768之计算机上运行,则WidthMultiplicationFactor和HeightMultiplicationFactor更改如下:

WidthMultiplicationFactor = 1024/1920 = 0.533
HeightMultiplicationFactor = 768/1080 = 0.711

末出半点栽重载方法,它们啊应用程序控件提供响应式解决方案(最佳大小,位置及字体大小)的终极方法。

public int GetMetrics(int ComponentValue)
{
    return (int)(Math.Floor(ComponentValue * WidthMultiplicationFactor));
}

public int GetMetrics(int ComponentValue, string Direction)
{
    if (Direction.Equals("Width") || Direction.Equals("Left"))
        return (int)(Math.Floor(ComponentValue * WidthMultiplicationFactor));
    else if (Direction.Equals("Height") || Direction.Equals("Top"))
        return (int)(Math.Floor(ComponentValue * HeightMultiplicationFactor));
    return 1;
}

比如,如果有宽度=465,高度=72,左=366,顶部=41以及字体大小=40的控件,则该方法返回建议之大大小小,位置和字体大小为:

Width = 465 * 0.533 = 248
Height = 72 * 0.711= 51
Left = 366 * 0.533= 195
Top = 41 * 0.711= 29
Font-size = 40 * 0.533 = 21

实在,这些方式返回缩放的控件与大小、位置与字体大小,而这些价值是亮的极致佳值。

使用 Responsive Class

咱们用之是坐任何需要应的样式简单地创造是类似的对象。
当前之分辨率是于构造函数中提供的, 之后的做事就是白手起家所欲的乘法因子。

Responsive ResponsiveObj;
ResponsiveObj = new Responsive(Screen.PrimaryScreen.Bounds);
ResponsiveObj.SetMultiplicationFactor();

在当时之后,表单的装有控件都拿逐条个传递,以以表单的加载事件被调整大小及更定位。
这个调用在下面的代码中形成。 它所开的是首先以窗体定位到屏幕的主干。
我当这里设置了一个校常数(30),为顶尖的垂直位置上加控件,这也许以开发人员而异。
之后,表单的各个一个控件都见面又定位,调整大小,并再次校准字体大小。

private void ResponsiveForm_Load(object sender, EventArgs e)
{
    Width = ResponsiveObj.GetMetrics(Width, "Width");           // Form width and height set up.
    Height = ResponsiveObj.GetMetrics(Height, "Height");
    Left = Screen.GetBounds(this).Width / 2 - Width / 2;        // Form centering.
    Top = Screen.GetBounds(this).Height / 2 - Height / 2 - 30;  // 30 is a calibration factor.

    foreach (Control Ctl in this.Controls)
    {
        Ctl.Font = new Font(FontFamily.GenericSansSerif, 
                   ResponsiveObj.GetMetrics((int)Ctl.Font.Size), FontStyle.Regular);
        Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
        Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
        Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
        Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
    }
}

使用 Responsive Class

我们要之凡为另外需要应的花样简单地创建是看似的靶子。
当前底分辨率是于构造函数中提供的, 之后的劳作就是成立所急需的乘法因子。

Responsive ResponsiveObj;
ResponsiveObj = new Responsive(Screen.PrimaryScreen.Bounds);
ResponsiveObj.SetMultiplicationFactor();

于当时以后,表单的具有控件都用各个个传递,以在表单的加载事件中调整大小以及还定位。
这个调用在脚的代码中成功。 它所召开的是率先用窗体定位到屏幕的骨干。
我以这里安装了一个校常数(30),为顶尖的垂直位置补加控件,这也许为开发人员而异。
之后,表单的各国一个控件都见面再次定位,调整大小,并再度校准字体大小。

private void ResponsiveForm_Load(object sender, EventArgs e)
{
    Width = ResponsiveObj.GetMetrics(Width, "Width");           // Form width and height set up.
    Height = ResponsiveObj.GetMetrics(Height, "Height");
    Left = Screen.GetBounds(this).Width / 2 - Width / 2;        // Form centering.
    Top = Screen.GetBounds(this).Height / 2 - Height / 2 - 30;  // 30 is a calibration factor.

    foreach (Control Ctl in this.Controls)
    {
        Ctl.Font = new Font(FontFamily.GenericSansSerif, 
                   ResponsiveObj.GetMetrics((int)Ctl.Font.Size), FontStyle.Regular);
        Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
        Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
        Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
        Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
    }
}

示例

以下是一个非常简单的表单,其中包含一个data
gird,一个label,一个textbox和一个button。
下面的图纸为三栽不同之分辨率截取。
下面的截图是在1920×1080分辨率下截取的:
亚洲必赢手机入口 1

脚的截图是当1360×768分辨率下截取的:
亚洲必赢手机入口 2

下的截图是在1024×768分辨率下截取的:
亚洲必赢手机入口 3

实在,通过压缩/扩大同还定位控制及最佳水平,Form在不同的分辨率下看起是一律的。

示例

以下是一个非常简单的表单,其中蕴蓄一个data
gird,一个label,一个textbox和一个button。
下面的图为三种植不同之分辨率截取。
下面的截图是在1920×1080分辨率下截取的:
亚洲必赢手机入口 4

下的截图是当1360×768分辨率下截取的:
亚洲必赢手机入口 5

下面的截图是在1024×768分辨率下截取的:
亚洲必赢手机入口 6

实在,通过缩小/扩大与还定位控制及超级水平,Form在不同的分辨率下看起是同等的。

代码调整

就如我们对垂直中心定位所召开的那么,我们兴许用安装有些参数来调动总体布局。

除此以外,建议开发者尝试以不同之分辨率查看表单的外观,以确认有的控件都是可见的,并依照预期在屏幕及对定位。

除此之外,对于一个概括的表单,这是一个通用的主意,它若表单的装有控件都有着这些性—宽度,高度,左侧,顶部以及字体大小。但是,真实情况并非如此。有一对表单控件不具有所有这些性。例如,图片框没有font-size属性。因此,如果这样的情况下没有明了处理,运行代码用会招致运行时大。本文旨在介绍这种措施,开发人员需要依据实际情形展开校准。建议之方式如下:

private void ResponsiveForm_Load(object sender, EventArgs e)
{
    Width = ResponsiveObj.GetMetrics(Width, "Width");           // Form width and height set up.
    Height = ResponsiveObj.GetMetrics(Height, "Height");
    Left = Screen.GetBounds(this).Width / 2 - Width / 2;        // Form centering.
    Top = Screen.GetBounds(this).Height / 2 - Height / 2 - 30;  // 30 is a calibration factor.

    foreach (Control Ctl in this.Controls)
    {
        if (Ctl is PictureBox)
        {
            Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
            Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
            Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
            Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
        }
        else
        {
            Ctl.Font = new Font(FontFamily.GenericSansSerif, 
                                ResponsiveObj.GetMetrics((int)Ctl.Font.Size), FontStyle.Regular);
            Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
            Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
            Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
            Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
        }
    }
}

兴许会见因业务员需要和控件的性来调动代码。
此外,可能要为不同的控件类型引入更多之重载方法。

代码调整

纵使如咱本着垂直中心定位所召开的那么,我们恐怕用设置有些参数来调整总体布局。

此外,建议开发者尝试以不同的分辨率查看表单的外观,以确认有的控件都是可见的,并论预期在屏幕及对定位。

除此之外,对于一个概括的表单,这是一个通用的法,它要表单的享有控件都兼备这些性—宽度,高度,左侧,顶部和字体大小。但是,真实情况并非如此。有有表单控件不具有所有这些性。例如,图片框没有font-size属性。因此,如果这样的情形下没有确定性处理,运行代码用会促成运行时充分。本文旨在介绍这种方法,开发人员需要基于实际情况进行校准。建议的方如下:

private void ResponsiveForm_Load(object sender, EventArgs e)
{
    Width = ResponsiveObj.GetMetrics(Width, "Width");           // Form width and height set up.
    Height = ResponsiveObj.GetMetrics(Height, "Height");
    Left = Screen.GetBounds(this).Width / 2 - Width / 2;        // Form centering.
    Top = Screen.GetBounds(this).Height / 2 - Height / 2 - 30;  // 30 is a calibration factor.

    foreach (Control Ctl in this.Controls)
    {
        if (Ctl is PictureBox)
        {
            Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
            Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
            Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
            Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
        }
        else
        {
            Ctl.Font = new Font(FontFamily.GenericSansSerif, 
                                ResponsiveObj.GetMetrics((int)Ctl.Font.Size), FontStyle.Regular);
            Ctl.Width = ResponsiveObj.GetMetrics(Ctl.Width, "Width");
            Ctl.Height = ResponsiveObj.GetMetrics(Ctl.Height, "Height");
            Ctl.Top = ResponsiveObj.GetMetrics(Ctl.Top, "Top");
            Ctl.Left = ResponsiveObj.GetMetrics(Ctl.Left, "Left");
        }
    }
}

或许会见根据业务员需要同控件的属性来调整代码。
此外,可能需要呢歧之控件类型引入更多的重载方法。

其他

如前所述,还发另外一些方,例如利用WPF,使用anchoring/docking等,这是一个再次明白之挑三拣四。
如果表单上产生数千个控件,则可能会见碰到加载延迟。
然而,这点延迟对今天运行高效的微机吧不成问题。
这种艺术就是于表单的加载时才实施同样次于调用操作,因此无见面带致命的性降低之问题。

其他

如前所述,还发生其他有办法,例如使用WPF,使用anchoring/docking等,这是一个再次智慧的挑三拣四。
如果表单上闹数千独控件,则可能会见遇到加载延迟。
然而,这点延迟对当今运作高效的计算机吧不成问题。
这种方法只有是以表单的加载时才实施同一软调用操作,因此不见面带动沉重之属性降低的题目。

结尾

开创响应式WinForm应用程序,根据机器的运作时分辨率自动调整大小,重新定位字体大小并再次校准字体大小,这是如出一辙栽面向开发人员的艺术。
只需要用此类添加到品种遭到,在App.config文件被安规划时分辨率,然后以窗体的加载事件被加上响应代码。
So easy!

结尾

创办响应式WinForm应用程序,根据机器的运转时分辨率自动调整大小,重新定位字体大小并更校准字体大小,这是同样栽面向开发人员的方法。
只需要用此类添加到路遭到,在App.config文件被安装规划时分辨率,然后以窗体的加载事件备受丰富响应代码。
So easy!

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图