当前位置: 首页 > wzjs >正文

一个人可做几次网站备案免费的网页制作软件

一个人可做几次网站备案,免费的网页制作软件,青岛开发区网站,新农村建设网站知乎WPF中实现动态加载图片浏览器(边滚动边加载) 在做图片浏览器程序时,遇到图片数量巨大的情况(如几百张、上千张),一次性加载所有图片会导致界面卡顿甚至程序崩溃。 本文介绍一种 WPF Prism 实现动态分页加…

WPF中实现动态加载图片浏览器(边滚动边加载)

在做图片浏览器程序时,遇到图片数量巨大的情况(如几百张、上千张),一次性加载所有图片会导致界面卡顿甚至程序崩溃。

本文介绍一种 WPF + Prism 实现动态分页加载图片的方法,结合 ScrollViewer 滚动条触底检测,实现 “边滚动,边加载” 的流畅体验。

1. 界面设计:4×4 显示 + 滚动条

我们希望界面每次显示 4×4,共 16 张图片,每张图片带有边框。

XAML示例

<ScrollViewer VerticalScrollBarVisibility="Auto" ScrollChanged="ScrollViewer_ScrollChanged"><ItemsControl ItemsSource="{Binding Images}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><UniformGrid Columns="4"/></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><Border BorderBrush="Gray" BorderThickness="1" Margin="5"><Image Source="{Binding}" Stretch="Uniform"/></Border></DataTemplate></ItemsControl.ItemTemplate></ItemsControl>
</ScrollViewer>
  • ScrollViewer 包裹 ItemsControl,开启垂直滚动。
  • 使用 UniformGrid 布局,4列均匀分布。
  • 每张图片用 Border 包一层,美观且清晰分隔。

2. 后台逻辑:ViewModel 分页加载

ViewModel 负责管理图片列表和分页逻辑。

public class ImageBrowserViewModel : BindableBase
{private const int PageSize = 16;private readonly List<string> allImagePaths = new();public ObservableCollection<BitmapImage> Images { get; } = new();private int currentPage = 0;public bool IsLoading { get; private set; }public void LoadAllImagePaths(string folderPath){allImagePaths.Clear();var extensions = new[] { ".jpg", ".png", ".bmp" };var files = Directory.GetFiles(folderPath).Where(f => extensions.Contains(Path.GetExtension(f).ToLower())).ToList();allImagePaths.AddRange(files);currentPage = 0;Images.Clear();}public async Task LoadNextPageAsync(){if (IsLoading) return;IsLoading = true;var nextImages = allImagePaths.Skip(currentPage * PageSize).Take(PageSize).ToList();foreach (var path in nextImages){await Task.Run(() =>{var bitmap = new BitmapImage();bitmap.BeginInit();bitmap.CacheOption = BitmapCacheOption.OnLoad;bitmap.UriSource = new Uri(path);bitmap.EndInit();bitmap.Freeze();App.Current.Dispatcher.Invoke(() => Images.Add(bitmap));});}currentPage++;IsLoading = false;}
}
  • LoadAllImagePaths:一次性记录所有图片路径,但不立刻加载图片内容。
  • LoadNextPageAsync:每次按页加载图片,使用 Task.Run + Dispatcher.Invoke,避免界面卡顿。

3. 滚动到底时加载新图片

ScrollViewerScrollChanged 事件中,检测是否接近底部,如果是则请求 ViewModel 加载下一页:

private async void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{var scrollViewer = (ScrollViewer)sender;if (scrollViewer.VerticalOffset + scrollViewer.ViewportHeight >= scrollViewer.ExtentHeight - 50) // 接近底部50像素{if (DataContext is ImageBrowserViewModel vm && !vm.IsLoading){await vm.LoadNextPageAsync();}}
}

ExtentHeight 是总高度,ViewportHeight 是当前可视区域高度,VerticalOffset 是当前滚动位置。

当滚动接近底部 50px 内,就触发加载。

4. 总结

通过以上方法,我们实现了:

  • 初始只加载少量图片,快速打开界面。
  • 用户滚动时,按需分页加载后续图片。
  • 界面不卡顿,体验丝滑流畅。

这种设计特别适合处理大量图片浏览、视频帧查看、缩略图管理器等场景。

http://www.dtcms.com/wzjs/380928.html

相关文章:

  • 做网站.cn好还是.com好郑州网站技术顾问
  • 武汉 外贸网站建设扬州seo优化
  • 武汉一医院网站建设免费建立自己的网站
  • iis6 网站无法访问郑州网站建设
  • 扁平风格网站 模板免费下载58同城推广效果怎么样
  • 南京谁做免费网站百度seo查询收录查询
  • 中小型企业网站优化推广优化网哪个牌子好
  • 动漫设计自考大专百度seo排名软件
  • 个人网站首页模板网络营销的公司有哪些
  • 哈尔滨网站建设外包公司google play三件套
  • 福建闽东建设网站软文写作技巧及范文
  • 网络彩票建立网站小程序开发软件
  • 微信怎么做收费视频网站谷歌推广哪家好
  • 建站如何赚钱营业推广方式
  • 国外做ui的网站j如何建立网站服务器
  • 快速搭建网站工具全国疫情又严重了
  • 网站无收录的原因seo手机关键词网址
  • 农业网站开发的实验报告sem培训班学费哪个好
  • 备案通青岛谷歌优化
  • 如何做网站排名百度平台客服怎么联系
  • web网站如何做负载均衡广告联盟app
  • 目前做网站最流行的程序语言免费b站软件下载
  • 网站设计 上海2023最新15件重大新闻
  • 手机端公司网站怎么做logo设计
  • 做动态网站可以不写代码吗怎样在百度上做广告推广
  • 创意广告视频网站百度文库官网登录入口
  • 面试网站建设问题什么叫优化关键词
  • 网站哪个公司好国内做网站比较好的公司
  • 怎么做会员自动售卡网站国内做网站的公司
  • 营销型网站建设应该注意什么百度关键字推广费用