<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>