Windows形式的可点击图像网格?

Con*_*ers 1 c# image-gallery winforms

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

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

干杯。

Sin*_*ian 5

好像不是特别难。我建议采取以下步骤:

  1. 将新的“用户控件”添加到您的图像缩略图项目中。它可以在其底部包含一个停靠PictureBox和一个LabelLinkLabel
  2. 对于每个缩略图周围的空间,只需使用Padding用户控件的属性即可。
  3. 对于将要保存缩略图的所谓网格,使用FlowLayoutPanel,然后简单地将上述用户控件的实例添加到此面板。
  4. 对于被选中的视觉表示,将用户控件实例的背景颜色更改为蓝色(例如),并在取消选中时返回控件面。建议也IsSelected为用户控件实现一个属性。
  5. 要模拟缩略图选择,请处理Click用户控件的事件并将所有缩略图实例的事件分配给单个事件处理程序方法。存储对已选择缩略图的全局引用,将其命名为例如SelectedThumbnail初始化为 null。在事件处理程序主体中,将sender与全局进行比较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
}
Run Code Online (Sandbox Code Playgroud)

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


进一步说明:我假设要创建的用户控件名为MyThumbnailControl,只是一个随机名称来引用该控件。当您创建一个新的用户控件时,向导会为您生成一个具有您想要的名称(例如MyThumbnailControl)的类,您可以在其中定义一个名为name的属性IsSelected并实现其 getter 和 setter。请参阅教程。定义用户控件后,您可以从其相应的类中实例化实例。同样通过全局引用,我指的是表单(或任何父控件)级别的变量。为简单起见,我们可以在将要保存网格和缩略图的表单中添加所选缩略图的引用:MyThumbnailControl selectedThumb = null;或在表单正文中添加类似的内容。