

























<behavior:Interaction.Triggers>
<behavior:EventTrigger EventName="PreviewMouseDown">
<behavior:InvokeCommandAction Command="{Binding PreviewMouseDownCmd}"/>
</behavior:EventTrigger>
</behavior:Interaction.Triggers>
private DelCmd previewMouseDownCmd; public DelCmd PreviewMouseDownCmd { get { if(previewMouseDownCmd==null) { previewMouseDownCmd = new DelCmd(PreviewMouseDownCmdExecuted, PreviewMouseDownCmdCanExecute); } return previewMouseDownCmd; } } private bool PreviewMouseDownCmdCanExecute(object? arg) { return IsLoading == true ? false : true; } private void PreviewMouseDownCmdExecuted(object? obj) { _ = InitBooksCollectionAsync(20000000); } private async Task InitBooksCollectionAsync(int cnt = 10000000) { if (IsLoading) { return; } IsLoading = true; if (cnt <= 0) { return; } try { BooksCollection = new ObservableCollection<Book>(); int batchCount = (cnt - 1 + batchSize) / batchSize; for (int batch = 0; batch < batchCount; batch++) { int actualSize = Math.Min(batchSize, cnt - batch * batchSize); List<Book> bksList = new List<Book>(actualSize); await Task.Run(() => { for (int i = 0; i < actualSize; i++) { var a = GetIncrementId(); bksList.Add(new Book() { Id = a, Name = $"Name_{a}", ISBN = $"ISBN_{a}", Abstract = $"Abstract_{a}", Author = $"Author_{a}", Comment = $"Comment_{a}", Content = $"Content_{a}", Summary = $"Summary_{a}", Title = $"Title_{a}", Topic = $"Topic_{a}" }); } }).ConfigureAwait(false); await PopulateBooksCollectionAsync(batch, bksList); } } finally { IsLoading = false; } } private async Task PopulateBooksCollectionAsync(int batch, List<Book> bksList) { await Application.Current.Dispatcher.InvokeAsync(() => { foreach (var bk in bksList) { BooksCollection.Add(bk); } bksList.Clear(); MainTitle = $"{DateTime.Now}," + $"batch:{batch + 1}," + $"loaded {BooksCollection.Count} items," + $"First Id:{BooksCollection[0]?.Id}," + $"Last Id:{BooksCollection[^1]?.Id}," + $"{GetMem()}"; }, System.Windows.Threading.DispatcherPriority.Background); }
<Window x:Class="WpfApp2.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:behavior="http://schemas.microsoft.com/xaml/behaviors" xmlns:local="clr-namespace:WpfApp2" mc:Ignorable="d" Background="White" Title="{Binding MainTitle}" WindowState="Maximized"> <Window.InputBindings> <MouseBinding Command="{Binding LeftMouseDownCommand}" Gesture="LeftClick" /> </Window.InputBindings> <Window.DataContext> <local:MainVM/> </Window.DataContext> <!--<behavior:Interaction.Triggers> <behavior:EventTrigger EventName="PreviewMouseDown"> <behavior:InvokeCommandAction Command="{Binding PreviewMouseDownCmd}"/> </behavior:EventTrigger> </behavior:Interaction.Triggers>--> <Grid Background="White" IsHitTestVisible="True"> <!--<Grid.InputBindings> <MouseBinding Command="{Binding LeftMouseDownCommand}" Gesture="LeftClick" /> </Grid.InputBindings>--> <ItemsControl ItemsSource="{Binding BooksCollection}"> <ItemsControl.Resources> <Style TargetType="MenuItem"> <Setter Property="FontSize" Value="30"/> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="FontSize" Value="50"/> <Setter Property="Foreground" Value="Red"/> </Trigger> </Style.Triggers> </Style> </ItemsControl.Resources> <ItemsControl.Template> <ControlTemplate> <ScrollViewer CanContentScroll="True"> <VirtualizingStackPanel IsItemsHost="True" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling" VirtualizingPanel.CacheLengthUnit="Item" VirtualizingPanel.CacheLength="2,2" ScrollViewer.CanContentScroll="True" ScrollViewer.IsDeferredScrollingEnabled="True" UseLayoutRounding="True" SnapsToDevicePixels="True"> </VirtualizingStackPanel> </ScrollViewer> </ControlTemplate> </ItemsControl.Template> <ItemsControl.ItemTemplate> <DataTemplate> <Grid Margin="20"> <Grid.InputBindings> <MouseBinding Command="{Binding DataContext.LeftMouseDownCommand, RelativeSource={RelativeSource AncestorType=Window}}" Gesture="LeftClick" /> </Grid.InputBindings> <Grid.Resources> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="30"/> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="FontSize" Value="40"/> <Setter Property="Foreground" Value="Red"/> </Trigger> </Style.Triggers> </Style> </Grid.Resources> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <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 Author}" Grid.Row="1" Grid.Column="0"/> <TextBlock Text="{Binding Abstract}" Grid.Row="1" Grid.Column="1"/> <TextBlock Text="{Binding Comment}" Grid.Row="1" Grid.Column="2"/> <TextBlock Text="{Binding Summary}" Grid.Row="2" Grid.Column="0"/> <TextBlock Text="{Binding Title}" Grid.Row="2" Grid.Column="1"/> <TextBlock Text="{Binding Topic}" Grid.Row="2" Grid.Column="2"/> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> <ItemsControl.ContextMenu> <ContextMenu> <MenuItem Header="Load Data" Command="{Binding LoadDataCmd}"/> </ContextMenu> </ItemsControl.ContextMenu> </ItemsControl> </Grid> </Window>
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。