Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 制作缩略图浏览器的三种方法。。。帮我选择_C#_Wpf - Fatal编程技术网

C# 制作缩略图浏览器的三种方法。。。帮我选择

C# 制作缩略图浏览器的三种方法。。。帮我选择,c#,wpf,C#,Wpf,我有3种制作缩略图浏览器的方法。在我看来,每种方法都是一种很好的方法,但是作为一个经验丰富的wpf开发人员,您会推荐哪种方法呢 最简单的是IValueConverter,它将路径作为输入并绑定到图像源 <Image Source="{Binding FullPath, Converter={StaticResource UriToBitmapConverter}, Mode=OneTime, IsAsync=True}" ... /> public class UriToBitma

我有3种制作缩略图浏览器的方法。在我看来,每种方法都是一种很好的方法,但是作为一个经验丰富的wpf开发人员,您会推荐哪种方法呢

  • 最简单的是
    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;
    }
    
  • 在我存储所有文件数据和缩略图的类中进行转换

    <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;
                }
            }
    
    
    公共类文件数据:INotifyPropertyChanged
    {
    私有字符串完整路径;
    公共位图源MyImage
    {
    得到
    {
    如果(_myimage==null)
    _myimage=GetImage(完整路径);
    返回我的图像;
    }
    }
    

  • 选项2对我来说似乎是最好的,因为它是在另一个线程中加载每个缩略图的最干净、最简单的方法。但在长时间图像提取期间,它们似乎都不适合浏览网络驱动器和更改文件夹,因为我看不到任何方法可以正确取消操作。

    我会使用WPF通过将路径字符串绑定到
    image.Sour来加载图像ce
    。使用
    ItemsControl
    可以将
    itemstemplate
    设置为您希望项目的显示方式,在这种情况下,您需要一个源绑定到字符串类型的完整路径的图像。无需转换器

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

    如果您希望只加载可见的图像,那么我建议您创建一个可以处理虚拟化的面板,并将其用作ItemsPanelTemplate。要更快地加载此控件,另一个建议是创建一个UserControl,该控件将在后台加载图像并在DataTemplate中使用。这两种方法都将提高e应用程序的性能。

    第四个选项:在ItemsControl中使用时为路径或位图创建数据模板。路径或位图取决于您是想将图像加载到内存中,还是只想在查看图像时根据需要加载它们。@poke所有版本都是my FileData类的数据模板:…I wou比如说,UI不应该关心加载或取消操作。这可以隐藏在某些服务/业务对象后面。取消操作可以只是任何实现
    GetImage(mypath)的方法
    并且可以让所有打开的请求立即返回一些空映像或null。如果
    GetThumbnail
    只是从缓存URI加载,您不需要担心线程。如果您只是将
    image.Source
    绑定到URI,WPF将自动异步加载它。请参阅。这与我的#1和#3相同(请参见两者中的第一行).关于你提到的用户控件,我想你说的是#2.我从来没有提到过使用转换器,所以我不同意#1.至于#3,我不建议创建一个新的视图模型来处理图像加载。我同意你应该创建一个控件来处理背景中的图像加载,这样你就可以在l如果源已更改或控件已卸载,则加载。在我所有的ObservableCollection中,我通过在#3中存储路径、大小、日期和位图源的GetFiles填充。我不知道viewmodels,所以这被认为是您提到的新viewmodel吗?
    <ItemsControl DataContext="{Binding Items}">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <VirtualizingStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <Image Source="{Binding FullPath}"/>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
     </ItemsControl>