在日常开发中经常遇到控件不能随着父容器大小的改变而且自动改变控件的所在位置和大小。以下是实现的代码

 /// <summary>
  /// 根据父容器实现控件自适应大小位置
  /// </summary>
  /// <param name="control">所需自适应大小位置的控件</param>
  private void ChangeLocationSizeByParent (Control control)
  {
    //记录父容器大小,来判断改变控件大小位置是因为父容器的改变还是通过设置控件大小位置去改变
    Size parentOldSize = control.Parent.Size;

    PointF locationPF = new PointF();
    locationPF.X = (float)control.Location.X / (float)control.Parent.Width;
    locationPF.Y = (float)control.Location.Y / (float)control.Parent.Height;
    
    PointF sizePF = new PointF();
    sizePF.X = (float)control.Width / (float)control.Parent.Width;
    sizePF.Y = (float)control.Height / (float)control.Parent.Height;

    control.LocationChanged += delegate (Object o, EventArgs e) {

      if (control.Parent != null&&parentOldSize.Equals(control.Parent.Size))
      {
        locationPF.X = (float)control.Location.X / (float)control.Parent.Width;
        locationPF.Y = (float)control.Location.Y / (float)control.Parent.Height;
        
      }
    };
    control.SizeChanged += delegate (Object o, EventArgs e) {

      if (control.Parent != null && parentOldSize.Equals(control.Parent.Size))
      {
        sizePF.X = (float)control.Width / (float)control.Parent.Width;
        sizePF.Y = (float)control.Height / (float)control.Parent.Height;
        
      }
    };
    control.ParentChanged += delegate (Object o, EventArgs e) {
      if (control.Parent == null)
      {
        return;
      }
      locationPF.X = (float)control.Location.X / (float)control.Parent.Width;
      locationPF.Y = (float)control.Location.Y / (float)control.Parent.Height;
      sizePF.X = (float)control.Width / (float)control.Parent.Width;
      sizePF.Y = (float)control.Height / (float)control.Parent.Height;
    };
    control.Parent.SizeChanged += delegate (Object po, EventArgs pe) {

      Control pControl = (Control)po;
      int x = (int)(pControl.Width * locationPF.X);
      int y = (int)(pControl.Height * locationPF.Y);
      control.Location = new Point(x, y);
      int width = (int)(pControl.Width * sizePF.X);
      int hetght = (int)(pControl.Height * sizePF.Y);
      control.Size = new Size(width, hetght);
      control.Refresh();
      parentOldSize = pControl.Size;
    };
  }

到此这篇关于C# Winform 实现控件自适应父容器大小的示例代码的文章就介绍到这了,更多相关C# Winform 控件自适应父容器大小内容请搜索乐虎体育以前的文章或继续浏览下面的相关文章希望大家以后多多支持乐虎体育!

C# Winform 实现控件自适应父容器大小的更多相关文章

  1. 基于C#的百度图片批量下载工具

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using Sys......

  2. 详解c#与js的rsa加密互通

    ASN.1 抽象语法表示(标记)ASN.1(Abstract Syntax Notation One )一种数据定义语言,描述了对数据进行表示、编码、传输和解码的数据格式。网络管理系统中的管理信息库(MIB)、应用程序的数据结构、协议数据单元(PDU)都是用ASN.1定义的。可以理解为ASN.1......

  3. 说说C# 8.0 新增功能Index和Range的^0是什么?

    前言在《C# 8.0 中使用 Index 和 Range》这篇中有人提出^0是什么意思?处于好奇就去试了,结果抛出异常。查看官方文档说^0索引与 sequence[sequence.Length] 相同,表达式 sequence[^0] 不会引发异常,就像 sequence[sequence.Len......

  4. 如何在C#中使用MSMQ

    MSMQ (Microsoft消息队列)是Windows中默认可用的消息队列。作为跨计算机系统发送和接收消息的可靠方法,MSMQ提供了一个可伸缩、线程安全、简单和使用方便的队列,同时为你提供了在Windows数据库中持久化消息的机会。MSDN指出:“消息队列(MSMQ)技术使在不同时间运行的应用程序......

  5. C# 获取当前总毫秒数的实例讲解

    在.Net下DateTime.Ticks获得的是个long型的时间整数,具体表示是至0001 年 1 月 1 日午夜 12:00:00 以来所经过时间以100纳秒的数字。转换为秒为Ticks/10000000,转换为毫秒Ticks/10000。如果要获取从1970年1月1日至当前时间所经过的毫秒数,......

  6. 使用 C# 9 的records作为强类型ID - 路由和查询参数

    上一篇文章,我介绍了使用 C# 9 的record类型作为强类型id,非常简洁public record ProductId(int Value); 但是在强类型id真正可用之前,还有一些问题需要解决,比如,ASP.NET Core并不知道如何在路由参数或查询字符串参数中正确的处理它们,在这篇文章中......

  7. C# Winform 实现控件自适应父容器大小

    在日常开发中经常遇到控件不能随着父容器大小的改变而且自动改变控件的所在位置和大小。以下是实现的代码/// <summary>/// 根据父容器实现控件自适应大小位置/// </summary>/// <param name="control">......

  8. C#9.0:Init相关总结

    背景在以前的C#版本里面,如果需要定义一个不可修改的的类型的做法一般是:声明为readonly,并设置为只包含get访问器,不包含set访问器。如下:public class PersonInfo{/// /// 身份编号/// public string UserCode { get; }/// ......

  9. C# Aspose.Words 删除word中的图片操作

    今天介绍下 Aspose.Words 对 word 中的图片进行删除string tempFile = Application.StartupPath + "\\resource\\templete\\项目建议书模板.doc";Document doc = new Documen......

  10. C#飞机打字游戏的代码示例(winform版)

    游戏界面程序代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using Syste......

随机推荐

  1. python中re模块的使用(正则表达式)

    一、什么是正则表达式?正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。二、正则表达式的匹配规则1.表......

  2. python re模块和正则表达式

    一、re模块和正则表达式先来看一个例子:https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/这是京东的注册页面,打开页面我们就看到这些要求输入个人信息的提示。假如我们随意的在手机号码这一栏输入一个11111111111,它会提示我......

  3. 文件监控性能问题【BUG】

    文件监控性能问题【BUG】背景:JAVA写了一个文件夹目录监控的程序,使用的是org.apache.commons.io.monitor 包,项目稳定运行了一个月,现场反馈,文件夹数据处理越来越慢,等到数据推送到前端要好几分钟,于是开始了寻找问题的路程。监控代码之前写的文件监控代码问题发现我在Ap......

  4. R语言 Factor类型的变量使用说明

    factor类型的创建1. factor( )> credit_rating <- c("BB", "AAA", "AA", "CCC", "AA", "AAA", &......

  5. 【Android初级】使用setContentView实现页面的转换效果(附源码)

    一提到Android中页面的切换,你是不是只想到了startActivity启动另一个Activity?其实在Android中,可以直接利用setContentView达到类似页面转换效果的!实现思路如下:在第一个Activity的布局中添加一个Button,实现点击事件点击该Button,调用se......

  6. Perl 的 Socket 客户端获取服务器时间

    #!/usr/local/bin/perl -Twrequire 5.6.0;use Socket;use FileHandle;use strict;my($remote, $port, @thataddr, $that,$them, $proto,@now,$hertime);print &qu......

  7. python编写函数注意事项

    1、编写注意(1)给函数指定描述名。(2)函数名称只包括小写字母和下划线。(3)每一个函数都应该包含简要说明其功能的注释,注释应该紧跟在函数定义之后,并且采用文档字符串格式。2、给形参指定默认值时,等号两侧不得有空格def function_name(parameter_0, parameter_1......

  8. golang操作mysql2

    目录Go操作MySQL连接下载依赖使用MySQL驱动初始化连接SetMaxOpenConnsSetMaxIdleConnsCRUD建库建表查询单行查询多行查询插入数据更新数据删除数据MySQL预处理什么是预处理?为什么要预处理?Go实现MySQL预处理SQL注入问题Go实现MySQL事务什么是事务?......

  9. C#飞机打字游戏的代码示例(winform版)

    游戏界面程序代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using Syste......

  10. nodejs的调试debug

    目录简介开启nodejs的调试调试的安全性使用WebStorm进行nodejs调试使用Chrome devTools进行调试使用node-inspect来进行调试其他的debug客户端简介对于开发者来说,在开发应用程序的过程中,往往为了开发方便和解决bug需要借助于编程语言的调试功能。一般来说我们需......