我有一个文件夹中图像位置的列表。
我有五个图片框可以模拟一个封面流类型区域,供用户浏览给定文件夹的图像。
我知道错误被触发了,因为集合中的第一个图像设置为第一个图片框,然后如果我点击cycleLeft(),则会出现负数。
我如何解释这个?例如,如果列表中的第一个图像已设置为最左侧,而有人单击左侧翻转,则将第一个图像放在列表的最后位置。
任何指导?
private void leftArrow_Click(object sender, EventArgs e)
{
cycleImagesLeft();
}
private void rightArrow_Click(object sender, EventArgs e)
{
cycleImagesRight();
}
public void cycleImagesLeft()
{
//imageThree is the center image, that's why I use it as a frame of reference.
int currentImage = pictures.IndexOf(imageThree.ImageLocation);
imageOne.ImageLocation = pictures[currentImage - 3];
imageTwo.ImageLocation = pictures[currentImage - 2];
imageThree.ImageLocation = pictures[currentImage - 1];
imageFour.ImageLocation = pictures[currentImage];
imageFive.ImageLocation = pictures[currentImage + 1];
}
public void cycleImagesRight()
{
int currentImage = pictures.IndexOf(imageThree.ImageLocation);
imageOne.ImageLocation = pictures[currentImage - 1];
imageTwo.ImageLocation = pictures[currentImage];
imageThree.ImageLocation = pictures[currentImage + 1];
imageFour.ImageLocation = pictures[currentImage + 2];
imageFive.ImageLocation = pictures[currentImage + 3];
}
答案 0 :(得分:2)
好吧,一个选项是使用辅助方法来确保值始终在边界内:
string GetPictureAt(int index)
{
// Copes with values which are two large or too small,
// but only as far as -pictures.Length
if (index < 0)
{
index += pictures.Length;
}
return pictures[index % pictures.Length];
}
然后:
public void CycleImagesLeft()
{
int currentImage = pictures.IndexOf(imageThree.ImageLocation);
imageOne.ImageLocation = GetPictureAt(currentImage - 3);
imageTwo.ImageLocation = GetPictureAt(currentImage - 2);
// etc
}
和CycleImagesRight()
相同。我认为这样做你想要的,但我没有完全按照你的倒数第二句话。
请注意,您仍然需要考虑少于5张照片的可能性。
答案 1 :(得分:1)
始终可以使用Circular List。至少这种方式将所有索引管理内容抽象出来(进入可测试和可重用的类)。
答案 2 :(得分:0)
imageOne.ImageLocation = (currentImage - 3 < 0) ? null : pictures[currentImage - 3];
....
imageFour.ImageLocation = (currentImage + 2 >= pictures.Count) ? null : pictures[currentImage + 2];
等