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

rn0zuynd  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(101)

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


的数据

private void Back_Openings(object sender, EventArgs e)
    {
        int left = mainPanel.Left;
        int top = mainPanel.Top;

        PictureBox p = (PictureBox)sender;
        var picture = new PictureBox            

        {
            Name = "back_PictureBox",
            Size = new Size(120, 20),
            Location = new Point(left, top),
            BackColor= p.BackColor,
            BorderStyle= BorderStyle.FixedSingle,
        };

        this.Controls.Add(picture);
        picture.BringToFront();

    }

字符串

gopyfrb3

gopyfrb31#

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

int _mainID = 0;
    private void AddPictureBoxToPanel(object? sender, EventArgs e)
    {
        if (sender is PictureBox pbSrce)
        {
            var picture = new PictureBox
            {
                Name = $"back_picturebox_{_mainID++}",
                Size = new Size(120, 20),
                BackColor = pbSrce.BackColor,
                BorderStyle = BorderStyle.FixedSingle,
            };
            var last = mainPanel.Controls.OfType<PictureBox>().LastOrDefault();
            if (last is null)
            {
                picture.Location = new Point();
            }
            else
            {
                // Does not wrap, and will eventually be outside the visible bounds.
                picture.Location = new Point(last.Bounds.Right, last.Top);
            }
            mainPanel.Controls.Add(picture);
            Text = $"ADDED: {picture.Name} {picture.Bounds}";
        }
    }

字符串


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

int flowID = 0;

    private void AddPictureBoxToFlowLayoutPanel(object? sender, EventArgs e)
    {
        if (sender is PictureBox pbSrce)
        {
            var picture = new PictureBox
            {
                Name = $"back_picturebox_{flowID++}",
                Size = new Size(120, 20),
                BackColor = pbSrce.BackColor,
                BorderStyle = BorderStyle.FixedSingle,
            };
            flowLayoutPanel.Controls.Add(picture);
        }
    }


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

private void ShowByName(object? sender, EventArgs e)
    {
        var boxesByName = new List<PictureBox>();
        for (int i = 0; i < _mainID; i++)
        {
            var name = $"back_picturebox_{i}";
            boxesByName.Add(mainPanel.Controls[name] as PictureBox);
        }
        var message =
            string.Join(
                Environment.NewLine,
                boxesByName.Select(_ => $"{_.Name} {_.Bounds}"));
        MessageBox.Show(message);
    }


t0ybt7op

t0ybt7op2#

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

private void Back_Openings(object sender, EventArgs e)
    {
        int left = mainPanel.Left;
        int top = mainPanel.Top;

        PictureBox p = (PictureBox)sender;
        var picture = new PictureBox            

        {
            Name = "back_PictureBox",
            Size = new Size(120, 20),
            Location = new Point(left + (count*120), top),
            BackColor= p.BackColor,
            BorderStyle= BorderStyle.FixedSingle,
        };

        this.Controls.Add(picture);
        picture.BringToFront();
        count++;
    }

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

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

相关问题