【发布时间】:2014-10-02 07:47:10
【问题描述】:
在我的 C# / WPF 应用程序中,我想显示来自图像文件目录树的图像缩略图网格(当前是 .bmp,但最终是其他格式)。将来我可能希望允许用户单击缩略图以查看更大的版本,或者将鼠标悬停在其上以查看一些技术细节,但现在我要做的就是显示缩略图。
图像的数量是不可预测的,我的指示是,如果图像数量超出我在屏幕上的容量(而不是缩小缩略图),则启用滚动功能。
我有一个递归例程来遍历树并识别要显示的文件。 . .
private bool WalkTree(String sRoot)
{
string sDirectoryName;
string sFileName;
int iDirectoryCount = 0;
DirectoryInfo DirInfo;
DirInfo = new DirectoryInfo(sRoot);
// Get a list of all the files in this directory.
foreach (FileInfo fi in DirInfo.GetFiles("*.bmp"))
{
sFileName = fi.Name;
// DO SOMETHING WITH FILE FOUND HERE
}
// Now get a list of all the subfolders in this directory.
foreach (DirectoryInfo di in DirInfo.GetDirectories())
{
sDirectoryName = di.Name;
WalkTree(sRoot + "\\" + sDirectoryName); //recurse!!
iDirectoryCount++;
}
return true;
} // End WalkTree
那么有什么好的方法来做到这一点?我应该使用什么 XAML 控件来放入所有这些?网格?我可以在其中添加行并使其在我递归并发现更多文件时滚动吗?或者我应该走两次树 - 一次是为了计数并配置我页面中的行和列,第二次是实际显示缩略图?还是我认为这一切都错了?
我觉得这个问题在过去一定已经解决了足够多的时间,所以肯定有一个规范的设计模式,但我找不到。
【问题讨论】:
-
使用带有 UniformGrid 的 ListBox 作为其项目面板。
-
... 然后在我进行时填充它,即在 WalkTree() 例程中进行 1 次传递?这听起来很合理。这里的其他人怎么看?有这方面的规范设计模式吗?
-
填写一个列表,然后数据绑定到它。
-
@poke - 如果我进行数据绑定,不是所有图像都必须先加载到内存中吗?我知道如何对集合类和数据库进行数据绑定,但我不确定如何对目录树中的一组 n 图像文件进行数据绑定,其中既没有文件数也没有拓扑树在运行时被发现之前是已知的。
-
这在很大程度上取决于您的数据绑定。例如,您可以使用文件名填充列表。这样,列表就不会占用太多内存。