C# Winform 实现控件自适应父容器大小的示例代码

 更新时间:2021年03月24日 10:39:44   作者:lcsyhh  
这篇文章主要介绍了C# Winform 实现控件自适应父容器大小的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

 /// <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#使用Lazy实现延迟加载的方法示例

    C#使用Lazy实现延迟加载的方法示例

    在C#中,Lazy< T> 类是一个非常有用的工具,它可以用于延迟加载值,在本文中,我们将详细介绍 Lazy< T> 的实现机制和用法,并提供一些示例来展示它的优势,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-06-06
  • C#结合Minio实现文件上传存储与更新

    C#结合Minio实现文件上传存储与更新

    MinIO是一个开源的对象存储服务器,专门设计用于在大规模数据存储环境中运行,这篇文章主要为大家介绍了C#如何结合Minio实现文件上传存储与更新,需要的可以参考下
    2024-03-03
  • C#中WPF ListView绑定数据的实例详解

    C#中WPF ListView绑定数据的实例详解

    这篇文章主要介绍了C#中WPF ListView绑定数据的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C#递归算法之归并排序

    C#递归算法之归并排序

    这篇文章主要介绍了C#递归算法中的归并排序,需要的朋友可以参考下。
    2016-06-06
  • C#使用加边法计算行列式的值

    C#使用加边法计算行列式的值

    这篇文章主要介绍了C#使用加边法计算行列式的值,实例分析了C#加边法计算行列式的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#操作非持久化内存映射文件详解

    C#操作非持久化内存映射文件详解

    多个进程之间,通过操作未映射到磁盘上现有文件的内存映射文件,可以实现数据共享和类似进程间通讯的功能,下面我们就来学习一下C#如何操作非持久化内存映射文件的吧
    2023-12-12
  • C#利用WebClient实现两种方式下载文件

    C#利用WebClient实现两种方式下载文件

    本篇文章主要介绍了C#利用WebClient 两种方式下载文件,详细的介绍了两种方式,非常具有实用价值,需要的朋友可以参考下。
    2017-02-02
  • c#中设置快捷键

    c#中设置快捷键

    c#中设置快捷键...
    2007-03-03
  • C# 基础入门--关键字

    C# 基础入门--关键字

    本文主要介绍了C# 基础知识--关键字的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • C#中的值传递和引用传递详细解析

    C#中的值传递和引用传递详细解析

    本篇文章主要是对C#中的引用传递与值传递进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01

最新评论