【问题标题】:How to expand the picturebox into another form?如何将图片框扩展为另一种形式?
【发布时间】:2012-05-30 19:50:45
【问题描述】:

目前,我的应用程序显示 6 个图片框,每个显示一个不断更新的图片。

现在,我希望在单击任何图片框时,图片框会扩展并填满整个屏幕,只显示所选的图片框。

这可能吗?我必须创建另一个表单来执行此操作吗?

提前致谢, 秘鲁人

【问题讨论】:

  • 适用于使用 WinForms 的桌面。

标签: c# winforms


【解决方案1】:

在每个图片框的onclick事件中(它们都可以指向同一个方法)

picturebox_Click(object sender .....)
{
    PictureBox pb= (PictureBox)sender;
    if (pb.dock==DockStyle.None)
        {
            pb.dock=DockStyle.Fill;
            pb.BringToFront();
        } 
    else
        pb.dock=DockStyle.None;
}

【讨论】:

    【解决方案2】:

    没有看到任何代码,这是您可以通过编程方式在点击时更改图片框的方法。

    pictureBox1.Dock = DockStyle.Fill
    

    所以你需要创建一个点击事件处理程序并像上面一样调用你的图片框的 Dock 函数。

    响应 cmets 更新

    有一个DockStyle.None可以将图片恢复到原始大小。

    如果我理解正确,您想要 6 张图片,然后当您单击其中一张时,它会填充、再次单击、缩小、单击另一张、填充等等...

    为此,您可以使用图片框上的 Dock 和 Visible 属性。现在,您似乎也在询问如何 来实际编写代码。好吧,如果您显示一些代码,我可以指点一下,而我的方法是:

    1. 将所有图片框放在一个列表中,并为它们分配状态BigSmall

    2. 为每个图片框写一个OnClick,改变点击图片框的状态。

    3. 然后每个 OnClick 都会调用一个辅助函数,该函数会遍历列表中的每个图片框并隐藏小的图片框和 DockStyle.Fill 大的图片框。

    上面的算法能满足你的需要吗?

    【讨论】:

    • 嗨,乔,但是使用这种方法,图片会填满屏幕,但其他图像仍然可见。其他图像仍会显示,并且所选图像会填满整个屏幕。我怎样才能只显示选择的图像并填满屏幕?
    • 如果只有 6 个 picturebox2.Visible = false,您可以通过编程方式隐藏它们
    • @joe - 我不确定您的表单是什么样子,但您打算如何返回原始屏幕。这是我认为您的应用程序的外观。一个表单中有六个图片框。如果您单击一个图片框应该覆盖整个表单,因此只显示该图片框中的图片。假设您要单击图片框 2。您打算如何做到这一点?请原谅我不完全明白。但是更多信息会帮助我帮助你。
    • 嗨,乔,是的,我尝试了您的代码,但正如 Abhi 所说,一旦选择图片框并展开并填满屏幕,随后无法返回选择第二个图片框。不确定如何做到这一点。
    • 好的,我已经用算法更新了我的答案,你想要多少图片框就可以了
    【解决方案3】:

    试试这样的。代码没有被重构,但我相信你可以做到这一点

    private bool isfill = false;
    
            private void pictureBox1_Click(object sender, EventArgs e)
            {
                if (!isfill)
                {
                    pictureBox1.Dock = DockStyle.Fill;
                    pictureBox2.Visible = false;
                    isfill = true;
                }
                else
                {
                    pictureBox1.Dock = DockStyle.None;
                    pictureBox2.Visible = true;
                    isfill = false;
                }
            }
    
            private void pictureBox2_Click(object sender, EventArgs e)
            {
                if (!isfill)
                {
                    pictureBox2.Dock = DockStyle.Fill;
                    isfill = true;
                    pictureBox1.Visible = false;
                }
                else
                {
                    pictureBox2.Dock = DockStyle.None;
                    isfill = false;
                    pictureBox1.Visible = true;
                }
    

    【讨论】:

    • 对于 6 个图片框,它会很丑,但它会起作用。除此之外,此代码将是页面和页面长...
    • 我明白了,这就是为什么我提到代码没有被重构。由于所有事件处理程序中的功能都是相同的,因此您可以将其放入不同的方法中并在每个图片框的事件处理程序中调用该方法。您甚至可以通过使用代码创建通用事件处理程序,然后将其分配给所有图片框来进一步改进代码。在这种情况下,您必须将发送者传递给方法。
    • 但是在每一个pictureBox_click中,你仍然需要复制/粘贴每个其他图片框的可见和dockstyle,本质上为n个图片框写n次相同的东西,即n * n行。顺便说一句,事件处理程序并不相同,因为每个图片框都需要知道以使所有其他图片框不可见......如果所有框都在列表中,那么写入和阅读的痛苦会大大
    • 我明白你的意思,但就像我说的,你可以创建一个通用事件处理程序,然后将它分配给所有图片框的单击事件。代码看起来像“K'leg”对这个问题的回答。 stackoverflow.com/a/10815728/1386241.
    • 那你为什么不先写一下K'leg写的东西呢?我认为我们都同意这是一个很好的解决方案。我们的解决方案肯定要短得多。不同之处在于我并不是说要写一些我没想到的东西;)
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多