首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >windows窗体中的可单击图像网格?

windows窗体中的可单击图像网格?
EN

Stack Overflow用户
提问于 2012-06-03 08:24:52
回答 2查看 8.9K关注 0票数 1

如果这是一个愚蠢的问题,请原谅我。我有少量使用C#的经验,但还没有达到这个程度。

我有一系列的图像,我想把它们放到一个网格中,每个图像周围都有空格,还有它们下面的文本,我希望它们是可点击的,所以当它们被点击时,它们就会被点击,双击就会运行一个事件。我有的最好的例子是程序ACDSee的用户界面。我已经用谷歌搜索了几个小时,但没有找到任何适用的东西。这是困难还是简单?谁能给我举个例子,或者给我指出正确的方向?

干杯。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-03 09:02:24

这看起来并不是很难。我建议采取以下步骤:

  1. 将一个新的“用户控件”添加到图像缩略图的项目中。它可以包含停靠的PictureBox和底部的LabelLinkLabel
  2. 对于每个缩略图周围的空间,只需使用用户控件的Padding属性即可。
  3. 对于将要容纳缩略图的所谓网格,使用FlowLayoutPanel,并只需将上述用户控件的实例添加到此面板中。<代码>H211<代码>H112有关所选内容的可视表示,请将用户控件实例的背景颜色更改为蓝色(例如),并在取消选择时返回控件外观。建议还为用户控件实现IsSelected属性。
  4. 若要模拟缩略图选择,请处理用户控件的Click事件,并将所有缩略图实例的事件分配给单个事件处理程序方法。存储对已经选择的缩略图的全局引用,将其命名为,例如,SelectedThumbnail初始化为空。在事件处理程序主体中,将sender与全局SelectedThumbnail进行比较,并根据需要进行更新。如果与sender关联的用户控件未被选中(例如,其背景不是蓝色的,或者IsSelectedfalse),则使其处于选中状态,或者更改其背景。否则,将背景更改为其默认颜色(例如,control-face)。

Click事件处理程序主体如下所示:

代码语言:javascript
复制
MyThumbnailControl ctrl = sender as MyThumbnailControl;
if(ctrl == null) return;
if(ctrl == SelectedThumbnail) return; // selected again
if(ctrl != SelectedThumbnail)
{
    ctrl.IsSelected = true;
    ctrl.BackColor = Color.Blue; 
    // it's better to set the back-color in the IsSelected property setter, not here
    SelectedThumbnail.IsSelected = false;
    SelectedThumbnail.BackColor = Color.Control;
    SelectedThumbnail = ctrl; // important part
}

还建议将所有要添加到所谓的网格中的缩略图实例也在单独的数组中引用。因此,通过简单的索引计算可以使用箭头键更改选择。

进一步注意:我假设要创建的用户控件名为MyThumbnailControl,只是引用该控件的随机名称。当你创建一个新的用户控件时,向导会为你生成一个带有你想要的名字(例如,MyThumbnailControl)的类,你可以在它里面定义一个名为IsSelected的属性,并实现它的getter和setter。有关教程,请参阅this。定义用户控件后,您可以从其对应的类实例化实例。另外,在全局引用中,我指的是窗体(或任何父控件)级别的变量。为了保持简单,我们可以在表单中添加所选缩略图的引用,该引用将包含网格和缩略图:MyThumbnailControl selectedThumb = null;或表单主体中的类似内容。

票数 5
EN

Stack Overflow用户

发布于 2012-06-03 10:37:26

有件事,我刚治好了你。

创建一个名为CreateImageList的C#项目,并在Form1中添加以下5个默认名称的控件,即Panel1、PictureBox1、Label1、Button1、Button2:

它的工作原理:

  1. 当页面加载时,它创建一个imageList对象并加载文件夹中的所有.jpg图像,当用户单击"Button1“时,PictureBox显示ImageList中的下一幅图像,当用户单击"Button2”时,picturebox显示来自ImageList的前一幅图像。
  2. Label1显示来自ImageList阵列的currentImage计数器。如果要编写特定内容,可以创建文本数组并与图像计数器同步。
  3. 当用户单击PictureBox时,将创建边框以显示图片PictureBox用户双击MessageBox显示DoubleClick事件。

现在,您可以使用以下代码:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace CreateImageList
{
public partial class Form1 : Form
{
    private int currentImage = 0;
    protected Graphics myGraphics;
    ImageList iPicList = new ImageList();

    public Form1()
    {
        InitializeComponent();
        DirectoryInfo dirImages = new DirectoryInfo("C:\\2012");
        iPicList.ImageSize = new Size(255, 255);
        iPicList.TransparentColor = Color.White;
        myGraphics = Graphics.FromHwnd(panel1.Handle);

        foreach (FileInfo file in dirImages.GetFiles())
        {
            if (file.Extension == ".jpg")
            {
                Image myImage = Image.FromFile(file.FullName);
                iPicList.Images.Add(myImage);
            }
        }

        if (iPicList.Images.Empty != true)
        {
            panel1.Refresh();
            currentImage = 0;
            // Draw the image in the panel.
            iPicList.Draw(myGraphics, 1, 1, currentImage);
            // Show the image in the PictureBox.
            pictureBox1.Image = iPicList.Images[currentImage];
            label1.Text = "Image #" + currentImage;
        }

    }

    private void showImage(int imgIndex)
    {
        // Draw the image in the panel.
        iPicList.Draw(myGraphics, 1, 1, currentImage);
        // Show the image in the PictureBox.
        pictureBox1.Image = iPicList.Images[currentImage];
        label1.Text = "image #" + currentImage;
        panel1.Refresh();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (iPicList.Images.Count - 1 > currentImage)
        {
            currentImage++;
        }
        else
        {
            currentImage = 0;
        }
        showImage(currentImage);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (iPicList.Images.Count - 1 >= currentImage)
        {
            if (currentImage == 0)
                currentImage = iPicList.Images.Count-1;
            else
                currentImage--;
        }
        else
        {
            currentImage = iPicList.Images.Count;
        }
        showImage(currentImage);
    }

    private void pictureBox1_DoubleClick(object sender, EventArgs e)
    {
        MessageBox.Show("Picture Box Double clicked");
    }

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        panel1.Refresh();
        myGraphics.DrawRectangle(Pens.Black, 0, 0, iPicList.Images[currentImage].Width + 1, iPicList.Images[currentImage].Height + 1);
        pictureBox1.Image = iPicList.Images[currentImage];
    }
}
}

您需要的更改包括:

将以下文件夹更改为包含大量jpg的位置:

代码语言:javascript
复制
DirectoryInfo dirImages = new DirectoryInfo("C:\\2012");

另外,如果您正在处理其他类型的图像,请在此处进行更改:

代码语言:javascript
复制
if (file.Extension == ".jpg") // Change it to your image type.

如果你不想使用按钮向上和向下,你有几个其他的选择,以宿主PictureBox控件在滚动面板或列表或其他东西。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10866984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档