c# - 类似资源管理器的图像浏览器的最佳控件

标签 c# wpf controls thumbnails

<分区>

我想创建一个界面类似于 Windows Explorer 的程序,其中显示缩略图和名称、大小等,并且正在徘徊要使用什么控件。

我想要它做的是:

  • 显示所有图片是代码选择的文件夹。它们可能有数百个,使用数百 MB,所以我需要它只渲染可见部分而不是整个内容
  • 允许选择一张或多张图片用于代码的其他部分(应用过滤器、复制到其他地方等)。当然,某些选定的图像可能不可见,因此可能无法呈现
  • 它应该允许每个项目使用多行信息(名称、尺寸、日期...)
  • 缩略图的大小应该很容易改变,如果一列中的项目多了或少了,我需要重排这些项目(这可以用代码来完成,但我更喜欢它在控件中)。当然这不应该改变选中项的列表(所以选中项不是按行和列标识的,而是按索引标识的)

我现在有的是这个(稍后会转到一个单独的函数)

thumb[] thumbs;

public MainWindow() {
    InitializeComponent();

    int i;
    string[] files=Directory.GetFileSystemEntries(@"C:\images","*.jpg",SearchOption.AllDirectories);
    System.Drawing.Size mySize=new System.Drawing.Size(128,128);

    thumbs=new thumb[files.Length];
    for(i=0; i<files.Length ;i++){
        thumbs[i]=new thumb(files[i],mySize);
    }
    //MessageBox.Show("Loaded "+i.ToString()+" images");
}

还有这个(稍后我可能会改用 Image.GetThumbnailImage() 作为调整大小的基础):

class thumb {
    public Bitmap bmp;
    public Size   originalSize;
    public string path;

    public thumb(string path, Size targetSize) {
        Bitmap tempBmp;
        this.path=path;
        tempBmp=new Bitmap(path);
        originalSize=tempBmp.Size;
        bmp=new Bitmap(tempBmp,targetSize);
        tempBmp.Dispose(); //get our memory back
    }
}

最佳答案

您可以将 ListBox 用作包含缩略图、名称等控件的容器。您可以为 ListBoxItem 创建 DataTemplate 或创建新的 UserControl 并将其用作 ListBox 的内容。

使用 WrapPanel 可以使它对应用程序窗口的大小非常敏感。

这是一个示例,您需要根据自己的需要进行更改,但这是一个很好的起点。

<ListBox x:Name="ListOfImages" ItemsSource="{Binding Images}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Width="120" Margin="10" HorizontalAlignment="Left">
                <Image Source={Binding ImagePath}" />
                <TextBlock Text={Binding Name}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <WrapPanel />
    </ItemsPanelTemplate>
</ListBox>

关于c# - 类似资源管理器的图像浏览器的最佳控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25501855/

相关文章:

wpf - 如何绑定(bind)到 ControlTemplate 中的 SelectedItem 属性?

c# - 如何在C#中执行此操作?

c# - 您可以向没有数据源的数据网格添加数据吗?

c# - 当用户移动窗口时 PushFrame 锁定 WPF 窗口

wpf - SSRS - 尚未为数据集 'dataset1' 提供数据源实例

java - Java Web 框架世界中的 ASP.NET Login 控件相当于什么?

C# Xamarin Forms MessagingCenter 不更新项目通过

c# - 从 C# 中引用的 DLL 获取执行程序集名称

c# - 为什么 Type.GetElementType 返回 null?

c# - 在 Visual C# 的 TreeView 控件中列出父节点的所有子节点