清风2014 2014-09-18 03:46 采纳率: 0%
浏览 898

C# 新添加的控件显示在最前

最近做项目,需要实现一个功能:
每次按下键盘的某个按键,截一张图,然后在窗体旁边的控件(容器A)上显示这张图片,目前我使用FlowLayoutPanel作为容器A,每生成一张图片就新添加一个PictureBox来显示该图片,并将PictureBox添加到容器A中,每次新添加的PictureBox是显示在容器A最后面的,但现在被要求每次最新添加的图片显示在最前面。完全计算坐标是可以的,但太麻烦,每添加一张图片都要遍历所有PictureBox并改变坐标,当容器A的Size变化的时候还得重新计算一遍。请问有什么方法可以较为简单地实现?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 17:51
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你可以使用以下步骤来实现你的需求:

    1. 使用ControlPaint类中的InsertBefore方法来插入一个新的控制。

    2. 在你需要插入的新位置调用InsertBefore方法。

    3. 为每个PictureBox创建一个事件处理器,每当有新的PictureBox时,就调用这个事件处理器。

    4. 在事件处理器中,你可以通过this.Parent属性访问到容器A。

    5. 通过this.Location属性获取当前PictureBox的位置信息,然后将其设置为一个新的位置。

    下面是具体的代码示例:

    using System;
    using System.Windows.Forms;
    
    public class PictureBoxHandler : IContainerControlAdapter, IPictureBoxControlAdapter
    {
        private PictureBox pictureBox;
        private Control control;
    
        public void SetParent(Control container)
        {
            this.control = container;
        }
    
        public void AddToContainer()
        {
            if (control != null && control.Controls.Count > 0)
            {
                var newControl = new PictureBox();
                newControl.Location = control.Location;
                newControl.Size = control.Size;
                newControl.BorderStyle = BorderStyle.Fixed3D;
                control.Controls.Add(newControl);
                control.Invalidate(); // 需要强制更新控件以反映更改
            }
        }
    
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
    
            if (pictureBox != null)
            {
                pictureBox.Location = control.Location;
                pictureBox.Size = control.Size;
            }
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Form form = new Form();
    
            PictureBox pictureBox1 = new PictureBox();
            PictureBox pictureBox2 = new PictureBox();
    
            PictureBoxHandler handler = new PictureBoxHandler();
            handler.SetParent(form);
    
            pictureBox1.ImageLocation = "Path to your image";
            pictureBox1.Location = new Point(10, 10);
            pictureBox1.Size = new Size(100, 100);
    
            pictureBox2.ImageLocation = "Another path to an image";
            pictureBox2.Location = new Point(200, 10);
            pictureBox2.Size = new Size(100, 100);
    
            form.Controls.Add(pictureBox1);
            form.Controls.Add(handler);
            form.Controls.Add(pictureBox2);
    
            form.Show();
        }
    }
    

    在这个例子中,我们首先定义了一个自定义的IPictureBoxControlAdapter接口,它包含了两个公共方法:SetParentAddToContainer。这两个方法分别用于设置PictureBox的父容器和向容器中添加一个新的PictureBox。

    Program类中,我们创建了两个PictureBox对象,它们分别对应于我们的两个PictureBox。然后,我们创建了一个PictureBoxHandler类,它实现了IContainerControlAdapter接口,以及IPictureBoxControlAdapter接口。这个类包含了一些私有的成员变量,包括pictureBoxcontrol。在Main方法中,我们创建了三个PictureBox对象,并分别设置了它们的ImageLocation、Location和Size属性。然后,我们使用Form类的Controls属性来获取所有的PictureBox对象,并将这些PictureBox添加到了PictureBoxHandler的容器中。

    注意:这个解决方案假设你已经在你的项目中启用了System.Windows.Forms命名空间。如果还没有启用,可以在项目的引用管理器中找到System.Windows.Forms库并启用它。

    评论

报告相同问题?