制作缩略图浏览器的三种方法......帮助我选择

时间:2014-02-18 15:57:58

标签: c# wpf

我有三种制作缩略图浏览器的方法。在我看来,每个人都认为这是一个很好的方法,但作为一名经验丰富的wpf开发者,您会选择哪条路线?

  1. 最简单的是IValueConverter,它将路径作为输入并绑定到图像源。

    <Image Source="{Binding FullPath, Converter={StaticResource UriToBitmapConverter}, Mode=OneTime, IsAsync=True}" ... />
    
    public class UriToBitmapConverter : IValueConverter
    {
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
     {
        if (value == null) return null;
        BitmapImage img = GetImage((string)value);
        return img;
    }
    
  2. 控制扩展图像。使用依赖属性提供路径

    public class MyImage : System.Windows.Controls.Image
    {
      public MyImage()
      {
        this.Loaded += new RoutedEventHandler(MyImage_Loaded);
      }
      void MyImage_Loaded(object sender, RoutedEventArgs e)
      {
        Task.Factory.StartNew(() =>
        {
           var source = GetImage(mypath);
           this.Dispatcher.Invoke(() => this.Source = source);
        });
      }
    ...
    }
    
  3. 在我存储所有文件数据的类中进行转换,还有缩略图

    <Image Source="{Binding Path=MyImage, Mode=OneTime, IsAsync=True}"/>
    
    public class FileData : INotifyPropertyChanged
    {
        private string fullPath;
        public BitmapSource MyImage
            {
                get
                {
                    if (_myimage == null)
                        _myimage = GetImage(fullpath);
                    return _myimage;
                }
            }
    
  4. 选项2对我来说似乎是最好的方法,也是在另一个线程中加载每个缩略图的简便方法。在长时间图像提取期间,它们似乎都不适合浏览网络驱动器和更改文件夹,因为我认为无法正确取消操作。

1 个答案:

答案 0 :(得分:1)

我会使用WPF通过将路径字符串绑定到Image.Source来加载图像。使用ItemsControl,您可以将ItemTemplate设置为您希望如何显示项目,在这种情况下,您需要一个源为绑定到FullPath的图像,该类型为string类型。不需要转换器。

<ItemsControl DataContext="{Binding Items}">
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <VirtualizingStackPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Image Source="{Binding FullPath}"/>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
 </ItemsControl>

如果您只想加载可见的图像,那么我建议您创建一个可以处理虚拟化的Panel,并将其用作ItemsPanelTemplate。此控件加载速度更快的另一个建议是创建一个UserControl,它将在后台加载Image并在DataTemplate中使用它。这两项都将改善您的应用程序的性能。