如果这是一个愚蠢的问题,请原谅我。我有少量的 C# 经验,但还没有达到这个程度。
我有一系列图像,我想将它们放入一个网格中,每个图像周围都有空间,还有它们下面的文本,我希望它们是可点击的,所以当它们被点击时,它们会出现,双击会运行一个事件。我最好的例子是程序的用户界面ACDSee
。我已经用谷歌搜索了几个小时,但没有提出任何适用的。这是困难的还是简单的?谁能给我一个例子,或者指出我正确的方向?
干杯。
如果这是一个愚蠢的问题,请原谅我。我有少量的 C# 经验,但还没有达到这个程度。
我有一系列图像,我想将它们放入一个网格中,每个图像周围都有空间,还有它们下面的文本,我希望它们是可点击的,所以当它们被点击时,它们会出现,双击会运行一个事件。我最好的例子是程序的用户界面ACDSee
。我已经用谷歌搜索了几个小时,但没有提出任何适用的。这是困难的还是简单的?谁能给我一个例子,或者指出我正确的方向?
干杯。
这似乎不是很困难。我建议采取以下步骤:
PictureBox
的和一个Label
或。LinkLabel
Padding
用户控件的属性即可。FlowLayoutPanel
,并简单地将上述用户控件的实例添加到此面板。IsSelected
建议也为用户控件实现一个属性。Click
用户控件的事件并将所有缩略图实例的事件分配给单个事件处理程序方法。存储对已选择缩略图的全局引用,将其命名为例如,SelectedThumbnail
初始化为 null。在事件处理程序主体中,将sender
与 global进行比较SelectedThumbnail
,并在需要时对其进行更新。如果与 关联的用户控件sender
未被选中(即,它的背景不是蓝色的,或者IsSelected
是false
),则使其被选中,或者改变它的背景。否则将背景更改为其默认颜色(例如,控制面)。事件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;
或者在表单正文中添加类似的内容。
这里有东西,我刚刚修好了你。
创建一个 C# 项目名称CreateImageList并在 Form1 中添加以下 5 个默认名称的控件,即 Panel1、PictureBox1、Label1、Button1、Button2:
这个怎么运作:
现在,您可以使用以下代码:
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 控件。