我有三种制作缩略图浏览器的方法。在我看来,每个人都认为这是一个很好的方法,但作为一名经验丰富的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;
}
控制扩展图像。使用依赖属性提供路径
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);
});
}
...
}
在我存储所有文件数据的类中进行转换,还有缩略图
<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;
}
}
选项2对我来说似乎是最好的方法,也是在另一个线程中加载每个缩略图的简便方法。在长时间图像提取期间,它们似乎都不适合浏览网络驱动器和更改文件夹,因为我认为无法正确取消操作。
答案 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中使用它。这两项都将改善您的应用程序的性能。