创建响应式WinForm应用措施并不那么简单。 响应式构造,在此我指的是应用措施在差别屏幕辨别率下的可用性。 对付WinForm应用措施,我们需要明确地按照辨别率来调解控件的巨细和从头定位。 虽然在使用WPF时有相关的实践应用,通过使用控件的docking和anchoring,或使用panels等要领,但本文供给了一种将响应式应用于WinForm应用措施的差别要领。
配景我在一个本身设计的简单游戏中遇到了问题:我设计了一台辨别率为1920x1080的机器, 但是当我试图在条记本电脑上播放时,发明应用措施界限跑到屏幕之外。由此很有须要让措施来适应差别辨别率的设备,而不是让用户来适应措施。 因此,我对代码进行了改造。
技术其实没什么技术可言,只是用了一个小技巧。我们用两个常量来生存设计时的屏幕辨别率,我们称之为设计时辨别率。这样,无论何时运行应用措施,它城市获得一个乘法因子,这实际上是一个比例因子,通过将当前辨别率除以设计时辨别率来获得该因子。 窗体的所有控件都被通报给这个类东西进行缩放和调解巨细。
代码 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; }例如,该应用措施设计在1920x1080辨别率。 如果此应用措施在辨别率为1024x768的计算机上运行,则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"); } } 示例