最近做项目,需要实现一个功能:
每次按下键盘的某个按键,截一张图,然后在窗体旁边的控件(容器A)上显示这张图片,目前我使用FlowLayoutPanel作为容器A,每生成一张图片就新添加一个PictureBox来显示该图片,并将PictureBox添加到容器A中,每次新添加的PictureBox是显示在容器A最后面的,但现在被要求每次最新添加的图片显示在最前面。完全计算坐标是可以的,但太麻烦,每添加一张图片都要遍历所有PictureBox并改变坐标,当容器A的Size变化的时候还得重新计算一遍。请问有什么方法可以较为简单地实现?
C# 新添加的控件显示在最前
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
你知我知皆知 2024-08-02 17:51关注以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
你可以使用以下步骤来实现你的需求:
-
使用
ControlPaint类中的InsertBefore方法来插入一个新的控制。 -
在你需要插入的新位置调用
InsertBefore方法。 -
为每个PictureBox创建一个事件处理器,每当有新的PictureBox时,就调用这个事件处理器。
-
在事件处理器中,你可以通过
this.Parent属性访问到容器A。 -
通过
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接口,它包含了两个公共方法:SetParent和AddToContainer。这两个方法分别用于设置PictureBox的父容器和向容器中添加一个新的PictureBox。在
Program类中,我们创建了两个PictureBox对象,它们分别对应于我们的两个PictureBox。然后,我们创建了一个PictureBoxHandler类,它实现了IContainerControlAdapter接口,以及IPictureBoxControlAdapter接口。这个类包含了一些私有的成员变量,包括pictureBox和control。在Main方法中,我们创建了三个PictureBox对象,并分别设置了它们的ImageLocation、Location和Size属性。然后,我们使用Form类的Controls属性来获取所有的PictureBox对象,并将这些PictureBox添加到了PictureBoxHandler的容器中。注意:这个解决方案假设你已经在你的项目中启用了
System.Windows.Forms命名空间。如果还没有启用,可以在项目的引用管理器中找到System.Windows.Forms库并启用它。解决 无用评论 打赏 举报-