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

WPF populate BooksCollection via Dispatcher.InvokeAsync,DispatcherPriority.Background in mvvm

Install-Package Prism.Wpf;
Install-Package Prism.DryIOC;

  

using System.Configuration;
using System.Data;
using System.Windows;namespace WpfApp26
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : PrismApplication{protected override Window CreateShell(){return Container.Resolve<MainWindow>();}protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterSingleton<IIDService, IDServive>();containerRegistry.RegisterSingleton<INameService, NameService>();containerRegistry.RegisterSingleton<IISBNService, ISBNService>();containerRegistry.RegisterSingleton<MainWindow>();containerRegistry.RegisterSingleton<MainWindowViewModel>();}}public interface IIDService{int GetId();}public class IDServive : IIDService{int idx = 0;public int GetId(){return Interlocked.Increment(ref idx);}}public interface INameService{string GetName();}public class NameService : INameService{int idx = 0;public string GetName(){return $"Name_{Interlocked.Increment(ref idx)}";}}public interface IISBNService{string GetISBN();}public class ISBNService : IISBNService{int idx = 0;public string GetISBN(){return $"ISBN_{Interlocked.Increment(ref idx)}_{Guid.NewGuid():N}";}}}public async Task InitBooksCollectionAsync(){var imgs = Directory.GetFiles(@"../../../Images");if (imgs == null || !imgs.Any()){return;}int imgLen = imgs.Count();BooksCollection = new ObservableCollection<Book>();List<Book> booksList = new List<Book>();for (int i = 1; i < 10000001; i++){booksList.Add(new Book(){Id = idService.GetId(),Name = nameService.GetName(),ISBN = isbnService.GetISBN(),Comment = $"Comment_{i}",Content = $"Content_{i}",Summary = $"Summary_{i}",Title = $"Title_{i}",Topic = $"Topic_{i}",ImgSource = GetImgSourceViaUrl(imgs[i % imgLen])});if (i % 100000 == 0){await Application.Current.Dispatcher.InvokeAsync(() =>{var tempList = booksList.ToList();booksList.Clear();foreach (var bk in tempList){BooksCollection.Add(bk);}MainTitle = $"{DateTime.Now} loaded {BooksCollection.Count} items";}, System.Windows.Threading.DispatcherPriority.Background);}}}using System.Configuration;
using System.Data;
using System.Windows;namespace WpfApp26
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : PrismApplication{protected override Window CreateShell(){return Container.Resolve<MainWindow>();}protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterSingleton<IIDService, IDServive>();containerRegistry.RegisterSingleton<INameService, NameService>();containerRegistry.RegisterSingleton<IISBNService, ISBNService>();containerRegistry.RegisterSingleton<MainWindow>();containerRegistry.RegisterSingleton<MainWindowViewModel>();}}public interface IIDService{int GetId();}public class IDServive : IIDService{int idx = 0;public int GetId(){return Interlocked.Increment(ref idx);}}public interface INameService{string GetName();}public class NameService : INameService{int idx = 0;public string GetName(){return $"Name_{Interlocked.Increment(ref idx)}";}}public interface IISBNService{string GetISBN();}public class ISBNService : IISBNService{int idx = 0;public string GetISBN(){return $"ISBN_{Interlocked.Increment(ref idx)}_{Guid.NewGuid():N}";}}}
private ImageSource GetImgSourceViaUrl(string imgUrl){if (!File.Exists(imgUrl)){return null;}if (imgCache.ContainsKey(imgUrl)){return imgCache[imgUrl];}BitmapImage bmi = new BitmapImage();bmi.BeginInit();bmi.UriSource = new Uri(imgUrl, UriKind.RelativeOrAbsolute);bmi.EndInit();if (bmi.CanFreeze){bmi.Freeze();}imgCache[imgUrl] = bmi;return bmi;}

 

image

 

 

image

 

 

 

 

 

 

 

image

 

 

 

 

<prism:PrismApplication x:Class="WpfApp26.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp26"xmlns:prism="http://prismlibrary.com/"> </prism:PrismApplication>using System.Configuration;
using System.Data;
using System.Windows;namespace WpfApp26
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : PrismApplication{protected override Window CreateShell(){return Container.Resolve<MainWindow>();}protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterSingleton<IIDService, IDServive>();containerRegistry.RegisterSingleton<INameService, NameService>();containerRegistry.RegisterSingleton<IISBNService, ISBNService>();containerRegistry.RegisterSingleton<MainWindow>();containerRegistry.RegisterSingleton<MainWindowViewModel>();}}public interface IIDService{int GetId();}public class IDServive : IIDService{int idx = 0;public int GetId(){return Interlocked.Increment(ref idx);}}public interface INameService{string GetName();}public class NameService : INameService{int idx = 0;public string GetName(){return $"Name_{Interlocked.Increment(ref idx)}";}}public interface IISBNService{string GetISBN();}public class ISBNService : IISBNService{int idx = 0;public string GetISBN(){return $"ISBN_{Interlocked.Increment(ref idx)}_{Guid.NewGuid():N}";}}}<Window x:Class="WpfApp26.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp26"xmlns:prism="http://prismlibrary.com/"WindowState="Maximized"mc:Ignorable="d"Title="{Binding MainTitle,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"Height="450" Width="800"prism:ViewModelLocator.AutoWireViewModel="True"><Grid><DataGrid ItemsSource="{Binding BooksCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"VirtualizingPanel.IsVirtualizing="True"VirtualizingPanel.VirtualizationMode="Recycling"VirtualizingPanel.CacheLength="2,2"VirtualizingPanel.CacheLengthUnit="Item"ScrollViewer.CanContentScroll="True"ScrollViewer.IsDeferredScrollingEnabled="True"CanUserAddRows="False"AutoGenerateColumns="False"><DataGrid.Columns><DataGridTemplateColumn><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid Width="{Binding DataContext.GridWidth,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"Height="{Binding DataContext.GridHeight,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"><Grid.Background><ImageBrush ImageSource="{Binding ImgSource}"/></Grid.Background><Grid.Resources><Style TargetType="TextBlock"><Setter Property="FontSize" Value="50"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Foreground" Value="Red"/></Trigger></Style.Triggers></Style></Grid.Resources><Grid.RowDefinitions><RowDefinition/><RowDefinition/> </Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock Text="{Binding Id}" Grid.Row="0" Grid.Column="0"/><TextBlock Text="{Binding Name}" Grid.Row="0" Grid.Column="1"/><TextBlock Text="{Binding ISBN}" Grid.Row="0" Grid.Column="2"/><TextBlock Text="{Binding Comment}" Grid.Row="0" Grid.Column="3"/><TextBlock Text="{Binding Content}" Grid.Row="1" Grid.Column="0"/><TextBlock Text="{Binding Summary}" Grid.Row="1" Grid.Column="1"/><TextBlock Text="{Binding Title}" Grid.Row="1" Grid.Column="2"/><TextBlock Text="{Binding Topic}" Grid.Row="1" Grid.Column="3"/></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid></Grid>
</Window>using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using System.Collections.ObjectModel;namespace WpfApp26
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();this.Loaded += async (s, e) =>{var vm = this.DataContext as MainWindowViewModel;if (vm != null){vm.GridHeight = this.ActualHeight;vm.GridWidth = this.ActualWidth;await vm.InitBooksCollectionAsync();}};}}public class MainWindowViewModel : BindableBase{IIDService idService;INameService nameService;IISBNService isbnService;Dictionary<string, ImageSource> imgCache = new Dictionary<string, ImageSource>();public MainWindowViewModel(IIDService idServiceValue, INameService nameServiceValue,IISBNService isbnServiceValue){idService = idServiceValue;nameService = nameServiceValue;isbnService = isbnServiceValue;}public async Task InitBooksCollectionAsync(){var imgs = Directory.GetFiles(@"../../../Images");if (imgs == null || !imgs.Any()){return;}int imgLen = imgs.Count();BooksCollection = new ObservableCollection<Book>();List<Book> booksList = new List<Book>();for (int i = 1; i < 10000001; i++){booksList.Add(new Book(){Id = idService.GetId(),Name = nameService.GetName(),ISBN = isbnService.GetISBN(),Comment = $"Comment_{i}",Content = $"Content_{i}",Summary = $"Summary_{i}",Title = $"Title_{i}",Topic = $"Topic_{i}",ImgSource = GetImgSourceViaUrl(imgs[i % imgLen])});if (i % 100000 == 0){await Application.Current.Dispatcher.InvokeAsync(() =>{var tempList = booksList.ToList();booksList.Clear();foreach (var bk in tempList){BooksCollection.Add(bk);}MainTitle = $"{DateTime.Now} loaded {BooksCollection.Count} items";}, System.Windows.Threading.DispatcherPriority.Background);}}}private ImageSource GetImgSourceViaUrl(string imgUrl){if (!File.Exists(imgUrl)){return null;}if (imgCache.ContainsKey(imgUrl)){return imgCache[imgUrl];}BitmapImage bmi = new BitmapImage();bmi.BeginInit();bmi.UriSource = new Uri(imgUrl, UriKind.RelativeOrAbsolute);bmi.EndInit();if (bmi.CanFreeze){bmi.Freeze();}imgCache[imgUrl] = bmi;return bmi;}private ObservableCollection<Book> booksCollection;public ObservableCollection<Book> BooksCollection{get{return booksCollection;}set{SetProperty(ref booksCollection, value);}}private double gridWidth;public double GridWidth{get{return gridWidth;}set{SetProperty(ref gridWidth, value);}}private double gridHeight;public double GridHeight{get{return gridHeight;}set{SetProperty(ref gridHeight, value);}}private string mainTitle;public string MainTitle{get{return mainTitle;}set{SetProperty(ref mainTitle, value);}}}public class Book{public int Id { get; set; }public string Name { get; set; }public string ISBN { get; set; }public string Comment { get; set; }public string Content { get; set; }public string Summary { get; set; }public string Title { get; set; }public string Topic { get; set; }public ImageSource ImgSource { get; set; }}
}

 

http://www.jsqmd.com/news/53312/

相关文章:

  • 2025 年 12 月 AMC12 竞赛备考:上海补课机构优选,选对助力高效冲分
  • 痞子衡嵌入式:i.MXRT中FlexSPI外设速度上限的三个影响因子(数据手册里的纠结)
  • Yanhua Mini ACDP-2 Module 38: BMW BDC2 Keys Learning LF Smart Key Antenna Bench Platform
  • 第二天—C++语法基础
  • 自指自洽,别具一格的逻辑,千奇百怪的因果
  • Day26垂直对齐方式--vertical-align
  • 2025 年 12 月上海 AMC12 择校指南:选对专业机构,高效冲刺竞赛目标
  • USB输入监控
  • 2025年度绍兴交通事故优秀律师推荐|聚焦实力与口碑
  • 最小链覆盖 - Dilworth 定理 小记
  • 我研发了一款电影截图拼接神器:Eagle 插件让你的影片收藏更专业
  • 有种人
  • memset 破坏string
  • 关于字符串的小记
  • [NOIP2024] 编辑字符串-题解
  • 机器人设备端AI技术实现突破
  • 11月27日日记
  • 信创环境 海光7455D+深信服超融合+阿里龙晰8.6 虚拟机扩容方法 - yi
  • 251127今天是学习的一天
  • 三菱Q/西门子S7-300 PLC互联Modbus TCP 转 Modbus RTU工业网关
  • 基于Java+SSM+Flask宠物综合服务平台(源码+LW+调试文档+讲解等)/宠物服务/宠物商城/宠物用品/宠物医疗/宠物美容/宠物寄养/宠物保险/宠物社区/宠物咨询/宠物培训 - 指南
  • 金融科技中网络安全的关键作用
  • 否定之否定的辩证法,谁会不承认?但又有多少人说的透?
  • Windows Update - Part 5: Timeline [discarded draft]
  • wechatapi-微信号二次开发
  • 2025年12月最新最全的AI搜索优化公司与GEO优化公司排行榜:8大国内头部Top级GEO服务商深度解析与AIEO推荐指南
  • CVE-2022-26271
  • MySQL性能分析(六)之Performance Schema监控SQL性能
  • js控制并发请求
  • Windows Update - Part 2: Update Package - Appendix