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