1

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

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

干杯。

4

2 回答 2

5

这似乎不是很困难。我建议采取以下步骤:

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

事件Click处理程序主体看起来像这样:

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。请参阅获取教程。定义用户控件后,您可以从其相应的类中实例化实例。同样通过全局引用,我的意思是表单(或任何父控件)级别的变量。为简单起见,我们可以在将保存网格和缩略图的表单中添加所选缩略图的引用:MyThumbnailControl selectedThumb = null;或者在表单正文中添加类似的内容。

于 2012-06-03T01:02:24.060 回答
-1

这里有东西,我刚刚修好了你。

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

在此处输入图像描述

这个怎么运作:

  1. 当页面加载时,它会创建一个 imageList 对象并从您提供的文件夹中加载所有 .jpg 图像
  2. ImageList 图像被设置到 PictureBox 控件中,当用户单击“Button1”时,图片框显示 ImageList 中的下一个图像,当用户单击“Button2”时,PictureBox 显示 ImageList 中的上一个图像。
  3. Label1 显示来自 ImageList Arrage 的 currentImage 计数器。如果你想写一些特定的东西,你可以创建一个文本数组并与你的图像计数器同步。
  4. 当用户单击 PictureBox 时,将创建一个边框以显示突出显示的图片
  5. 当用户双击 PictureBox 时,会出现一个 MessageBox,显示 DoubleClick 事件。

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

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 的地方:

DirectoryInfo dirImages = new DirectoryInfo("C:\\2012");

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

if (file.Extension == ".jpg") // Change it to your image type.

如果您不想使用按钮上下移动,您还有其他几个选项可以在可滚动面板或列表或其他内容中托管 PictureBox 控件。

于 2012-06-03T02:37:26.207 回答