1

我有超过 1000 张图片要整理。但为了简化起见,假设我的硬盘上有以下文件:

 C:\a.jpg
 C:\b.jpg
 C:\c.jpg
 C:\d.jpg
 C:\e.jpg

该程序将确定需要显示哪些文件并将它们存储为一个数组:

 string[] filesToDisplay = new string[] { "C:\b.jpg", "C:\e.jpg" };

我想打开一个窗口,仅将 filesToDisplay 的内容显示为缩略图,因此我可以单击并打开它们。这将允许我只对选定的图像进行排序,而不是对所有图像进行排序。

到目前为止我已经尝试过:

到目前为止,我已经尝试打开一个资源管理器窗口,但我无法弄清楚如何只选择特定文件。有时使用:

 System.Diagnostics.Process.Start("explorer.exe", argument);

我也考虑过使用 IExplorerBrowser,但它看起来很复杂,我不确定它是否支持缩略图?

谢谢阅读

4

2 回答 2

1

您可以使用 Directory-class ( link ) 和 GetFiles()-Method ( link ) 来搜索要显示为缩略图的文件。

您可以在 ListView 中显示的那些文件。

在这里您可以找到一些有关如何为文件创建缩略图的提示:获取任何文件的缩略图,不仅是 Windows XP/Vista 上的图像文件

如果您只想显示图像文件,您可以通过这种方式创建缩略图

Image image = Image.FromFile(fileName);
Image thumb = image.GetThumbnailImage(120, 120, ()=>false, IntPtr.Zero);
于 2013-10-17T21:49:16.960 回答
1

我认为没有办法仅使用资源管理器显示某些图像,但是您可以将它们添加到 ListBox 并在 DoubleClick 上打开文件。

粗略的 WPF 示例:

代码:

using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApplication13
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private ObservableCollection<string> _files = new ObservableCollection<string>();
        private string _selectedFile;

        public MainWindow()
        {
            InitializeComponent();

            foreach (var file in Directory.GetFiles(@"C:\"))
            {
                Files.Add(file);
            }
        }

        void Item_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            Process.Start(SelectedFile);
        }

        public ObservableCollection<string> Files
        {
            get { return _files; }
            set { _files = value; }
        }

        public string SelectedFile
        {
            get { return _selectedFile; }
            set { _selectedFile = value; NotifyPropertyChanged("SelectedFile"); }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

xml:

<Window x:Class="WpfApplication13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="400" Width="400" Name="UI"  WindowStartupLocation="CenterScreen">
    <Grid DataContext="{Binding ElementName=UI}">
        <ListBox ItemsSource="{Binding Files}" SelectedItem="{Binding SelectedFile}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListBox.Resources>
                <Style TargetType="ListBoxItem">
                    <EventSetter Event="MouseDoubleClick" Handler="Item_MouseDoubleClick" />
                    <Setter Property="BorderThickness" Value="1" />
                    <Setter Property="BorderBrush" Value="Black" />
                    <Setter Property="Margin" Value="2" />
                </Style>
            </ListBox.Resources>
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel IsItemsHost="True" ItemHeight="50" ItemWidth="50"  />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Image Source="{Binding}" Margin="2"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

结果:

在此处输入图像描述

于 2013-10-17T21:47:10.547 回答