winforms 将PictureBox添加到另一个PictureBox旁边

rn0zuynd  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(145)

当我点击彩色图片框时,一个彩色图片框被添加到主面板。
下一次我点击按钮时,下一个图片框应该会被添加到前一个图片框的旁边。你如何获得前一个图片框的左和宽度?


的数据

  1. private void Back_Openings(object sender, EventArgs e)
  2. {
  3. int left = mainPanel.Left;
  4. int top = mainPanel.Top;
  5. PictureBox p = (PictureBox)sender;
  6. var picture = new PictureBox
  7. {
  8. Name = "back_PictureBox",
  9. Size = new Size(120, 20),
  10. Location = new Point(left, top),
  11. BackColor= p.BackColor,
  12. BorderStyle= BorderStyle.FixedSingle,
  13. };
  14. this.Controls.Add(picture);
  15. picture.BringToFront();
  16. }

字符串

gopyfrb3

gopyfrb31#

您有几个选项可以将PictureBox添加到另一个PictureBox旁边。要回答您的具体问题,* 如何获得先前添加的PictureBox的Left和Width?*,一种方法是对mainPanelControls集合进行Linq查询。

  1. int _mainID = 0;
  2. private void AddPictureBoxToPanel(object? sender, EventArgs e)
  3. {
  4. if (sender is PictureBox pbSrce)
  5. {
  6. var picture = new PictureBox
  7. {
  8. Name = $"back_picturebox_{_mainID++}",
  9. Size = new Size(120, 20),
  10. BackColor = pbSrce.BackColor,
  11. BorderStyle = BorderStyle.FixedSingle,
  12. };
  13. var last = mainPanel.Controls.OfType<PictureBox>().LastOrDefault();
  14. if (last is null)
  15. {
  16. picture.Location = new Point();
  17. }
  18. else
  19. {
  20. // Does not wrap, and will eventually be outside the visible bounds.
  21. picture.Location = new Point(last.Bounds.Right, last.Top);
  22. }
  23. mainPanel.Controls.Add(picture);
  24. Text = $"ADDED: {picture.Name} {picture.Bounds}";
  25. }
  26. }

字符串


的数据
这个屏幕截图显示了第二个选项,它“可能适合也可能不适合”您的项目,那就是使用FlowLayoutPanel,让它来处理所有这些事情。

  1. int flowID = 0;
  2. private void AddPictureBoxToFlowLayoutPanel(object? sender, EventArgs e)
  3. {
  4. if (sender is PictureBox pbSrce)
  5. {
  6. var picture = new PictureBox
  7. {
  8. Name = $"back_picturebox_{flowID++}",
  9. Size = new Size(120, 20),
  10. BackColor = pbSrce.BackColor,
  11. BorderStyle = BorderStyle.FixedSingle,
  12. };
  13. flowLayoutPanel.Controls.Add(picture);
  14. }
  15. }


第三种方法是创建一个有意义的PictureBox对象,然后使用Controls集合的string索引器来检索所需的对象。

  1. private void ShowByName(object? sender, EventArgs e)
  2. {
  3. var boxesByName = new List<PictureBox>();
  4. for (int i = 0; i < _mainID; i++)
  5. {
  6. var name = $"back_picturebox_{i}";
  7. boxesByName.Add(mainPanel.Controls[name] as PictureBox);
  8. }
  9. var message =
  10. string.Join(
  11. Environment.NewLine,
  12. boxesByName.Select(_ => $"{_.Name} {_.Bounds}"));
  13. MessageBox.Show(message);
  14. }


展开查看全部
t0ybt7op

t0ybt7op2#

将图片的宽度添加到左边的Location点,应该可以做到这一点。您已经给了图片Size(120, 20),我假设这意味着您的图片是20像素高,120像素宽。您需要使用宽度。为了使其工作,您需要有一个count整数,在程序开始时等于0,每次你创建一个新的盒子时,它都会增加1。然后你要把盒子的宽度加到位置的左起始点上,乘以count变量。你不应该在你给我们看的代码中创建并给count变量赋值0,因为你不想总是用0创建它。
然后将其添加到location乘以width,然后每次创建图片时都应添加1。例如:

  1. private void Back_Openings(object sender, EventArgs e)
  2. {
  3. int left = mainPanel.Left;
  4. int top = mainPanel.Top;
  5. PictureBox p = (PictureBox)sender;
  6. var picture = new PictureBox
  7. {
  8. Name = "back_PictureBox",
  9. Size = new Size(120, 20),
  10. Location = new Point(left + (count*120), top),
  11. BackColor= p.BackColor,
  12. BorderStyle= BorderStyle.FixedSingle,
  13. };
  14. this.Controls.Add(picture);
  15. picture.BringToFront();
  16. count++;
  17. }

字符串
与您的代码相比,更改有2个。第一个更改是在左侧位置添加+ (count * 120)。这样,您的位置将从右侧120像素开始,每添加一张图片。由于count在开始时为0,因此不会影响第一张图片。另一个更改是在末尾添加count++;,这将确保count每次都上升。
另一种方法是将+ (count * 120)添加到代码顶部的左变量中,如下所示:

  1. int left = mainPanel.Left + (count * 120);

展开查看全部

相关问题