当前位置: 首页 > 编程语言 > C#

如何异步加载和显示图片分享

时间:2023-04-10 23:03:56 C#

如何异步加载和显示图片我是WPF的新手,但是我已经做了很长时间的C#,目前正在开发一个简单的窗口(WindowsDesktop),它应该可视化目录中的所有照片。应用程序还应该知道我使用DLL的EXIF数据,如ISO、光圈等。我定义了一个照片类:publicclassPhoto{publicstringFileName{get;放;}publicintISO{得到;放;}...}我想在运行时存储在一个列表中。然后我声明了一个带有Image控件和TextBlock的PhotoItem(XAML用户控件)。每创建一个Photo,都会创建一个PhotoItem,并将对应的Photo保存为一个属性:publicpartialclassPhotoItem:UserControl{...publicPhotoPhoto{get;放;}...}从这个Photo属性,PhotoItem知道在哪里可以找到图像以及要显示什么ISO等。现在回答我的问题。如果用户选择一个目录,加载图像本身和元数据会花费很长时间,所以我想首先将所有PhotoItem添加到窗口(仍然是空的),然后运行元数据查找和图像缩略图来加载每个他们。当然,如果这些操作不阻塞UI线程是最好的,所以我目前使用一个Task来收集元数据,一个来收集缩略图。如果图像的元数据现在可用,我将如何更新PhotoItems?基本上,您如何为所有数据建立一个集中位置,任务可以向其提供更新,UI线程可以从中创建信息。我知道XAML/WPF中的BindingsPhoto.ISO,但是如果未收集元数据,Photo.ISOTextBlock的文本绑定到Photo.ISO变量将始终显示为零。在这种情况下,我想隐藏PhotoItem上的所有文本详细信息。另一方面,我也考虑过在PhotoItem中实现类似“刷新”功能的功能,但这会重新加载图像并花费很长时间(这可能是我最喜欢的WinForms方法,大声笑)。谁能告诉我如何实现这一目标?提前致谢!让我们看一个没有UserControl的基本示例。第一步是创建视图模型以启用数据绑定。您可以使Photo类实现INotifyPropertyChanged接口以在属性值更改时更新绑定。下面的类还声明了一个Image属性,其中包含异步加载的ImageSource派生对象。公共类照片:INotifyPropertyChanged{公共事件PropertyChangedEventHandlerPropertyChanged;privatevoidNotifyPropertyChanged(stringpropertyName){PropertyChanged?.Invoke(this,newPropertyChangedEventArgs(propertyName));}publicstringFileName{get.stringEvent=stringsetate;};公共字符串ISO{获取{返回iso;}设置{iso=值;NotifyPropertyChanged(名称(ISO));}}私有ImageSource图片;publicImageSourceImage{get{返回图像;}设置{图像=值;NotifyPropertyChanged(名称(图片));}}publicasyncTaskLoad(){Image=awaitTask.Run(()=>{using(varfileStream=newFileStream(FileName,FileMode.Open,FileAccess.Read)){returnBitmapFrame.Create(fileStream,BitmapCreateOptions.无,BitmapCacheOption.OnLoad);}});感光度="1600";}}视图模型的第二部分是一个包含Photo实例集合的类:publicclassViewModel{publicObservableCollectionPhotos{get;}=新的ObservableCollection();对于典型的数据绑定场景,您可以XAML将此类的一个实例分配给窗口的DataContext:最后一部分是ListBox的声明,其中包含一个DataTemplate以可视化照片:现在您可以像这样在MainWindow的异步加载事件处理程序中填充照片集合:以上是C#学习教程:如何异步加载和显示图片分享的所有内容。如果对大家有用,需要了解更多C#学习教程,希望大家多加关注—privateasyncvoidWindow_Loaded(objectsender,RoutedEventArgse){varvm=(ViewModel)DataContext;foreach(varfileinDirectory.EnumerateFiles(...)){vm.Photos.Add(newPhoto{FileName=file});}foreach(vm.Photos中的varphoto){等待照片。加载();}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: