Install-Package Prism.Wpf;
Install-Package Prism.DryIOC;
//app.xaml <prism:PrismApplication x:Class="WpfApp38.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp38"xmlns:prism="http://prismlibrary.com/" ><Application.Resources></Application.Resources> </prism:PrismApplication>//app.xaml.cs using Prism.DryIoc; using Prism.Ioc; using System.Windows; using WpfApp38.ViewModels; using WpfApp38.Views;namespace WpfApp38 {/// <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.RegisterForNavigation<ViewA, ViewAViewModel>("ViewA");containerRegistry.RegisterForNavigation<ViewB, ViewBViewModel>("ViewB");containerRegistry.RegisterForNavigation<MainWindow, MainWindowViewModel>("MainWindow");}protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings){base.ConfigureRegionAdapterMappings(regionAdapterMappings);}protected override void OnInitialized(){base.OnInitialized();var regionManager=Container.Resolve<IRegionManager>();regionManager.RequestNavigate("MainRegion", "ViewA");}protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);}}}//MainWindow.xaml <Window x:Class="WpfApp38.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:WpfApp38"mc:Ignorable="d"WindowState="Maximized"Title="{Binding MainVMTitle,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"xmlns:prism="http://prismlibrary.com/"prism:ViewModelLocator.AutoWireViewModel="True"><Window.Resources><Style TargetType="Button"><Setter Property="FontSize" Value="50"/></Style></Window.Resources><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Button Content="View A"Grid.Row="0"Grid.Column="0"Command="{Binding NavigateCommand}"CommandParameter="ViewA"/><Button Content="View B"Grid.Row="0"Grid.Column="1"Command="{Binding NavigateCommand}"CommandParameter="ViewB"/><ContentControl Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"Background="Cyan"prism:RegionManager.RegionName="MainRegion"VerticalAlignment="Stretch"/></Grid> </Window>//MainWindow.xaml.cs 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;namespace WpfApp38 {/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}} }//MainWindowViewModel.cs using System; using System.Collections.Generic; using System.Text;namespace WpfApp38.ViewModels {public class MainWindowViewModel : BindableBase{private readonly IRegionManager regionManager;public MainWindowViewModel(IRegionManager regionManagerValue){regionManager = regionManagerValue;MainVMTitle=$"In Main Window,{DateTime.Now.ToString("yyyy-MM-dd:HH-mm-ss")}";System.Timers.Timer tmr = new System.Timers.Timer();tmr.Elapsed+=Tmr_Elapsed;tmr.Interval=1000;tmr.Start();NavigateCommand=new DelegateCommand<string>(NavigateCommandExecuted);}private void NavigateCommandExecuted(string viewName){if (!string.IsNullOrEmpty(viewName)){regionManager.RequestNavigate("MainRegion", viewName);}}private void Tmr_Elapsed(object? sender, System.Timers.ElapsedEventArgs e){MainVMTitle=$"In Main Window,{DateTime.Now.ToString("yyyy-MM-dd:HH-mm-ss")}";}private string mainVMTitle;public string MainVMTitle{get{return mainVMTitle;}set{SetProperty(ref mainVMTitle, value);}}public DelegateCommand<string> NavigateCommand { get; set; }} }//ViewA.xaml <UserControl x:Class="WpfApp38.Views.ViewA"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApp38.Views"mc:Ignorable="d" VerticalAlignment="Stretch"HorizontalAlignment="Stretch"xmlns:prism="http://prismlibrary.com/"prism:ViewModelLocator.AutoWireViewModel="True"><Grid><Grid.RowDefinitions><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><ListBox Grid.Row="0"ItemsSource="{Binding SlimBooksCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"VirtualizingPanel.IsVirtualizing="True"VirtualizingPanel.IsContainerVirtualizable="True"VirtualizingPanel.VirtualizationMode="Recycling"ScrollViewer.IsDeferredScrollingEnabled="True"><ListBox.ItemTemplate><DataTemplate><Grid Width="{Binding DataContext.LbxWidth,RelativeSource={RelativeSource AncestorType=UserControl}}"Height="{Binding DataContext.LbxHeight,RelativeSource={RelativeSource AncestorType=UserControl}}"><Grid.Resources><Style TargetType="TextBlock"><Setter Property="FontSize" Value="50"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="FontSize" Value="100"/><Setter Property="Foreground" Value="Red"/></Trigger></Style.Triggers></Style></Grid.Resources><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock Text="{Binding Id}" Grid.Column="0" Width="Auto"/><TextBlock Text="{Binding Name}" Grid.Column="1" Width="Auto"/><TextBlock Text="{Binding Title}" Grid.Column="2" Width="Auto"/><TextBlock Text="{Binding ISBN}" Grid.Column="3" Width="Auto"TextWrapping="Wrap"/></Grid></DataTemplate></ListBox.ItemTemplate></ListBox><Button Grid.Row="1"Content="View A ReLoad Data"Command="{Binding LoadViewADataCommand}"/></Grid> </UserControl>//ViewA.xaml.cs using System; using System.Collections.Generic; 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;namespace WpfApp38.Views {/// <summary>/// Interaction logic for ViewA.xaml/// </summary>public partial class ViewA : UserControl{public ViewA(){InitializeComponent();}} }//ViewB.xaml <UserControl x:Class="WpfApp38.Views.ViewB"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WpfApp38.Views"xmlns:prism="http://prismlibrary.com/"mc:Ignorable="d" VerticalAlignment="Stretch"HorizontalAlignment="Stretch"prism:ViewModelLocator.AutoWireViewModel="True"><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><TextBlock Grid.Row="0"Text="{Binding ViewBTitle,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"><TextBlock.Style><Style TargetType="TextBlock"><Setter Property="FontSize" Value="50"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Foreground" Value="Red"/><Setter Property="FontSize" Value="100"/></Trigger></Style.Triggers></Style></TextBlock.Style></TextBlock><DataGrid Grid.Row="1"ItemsSource="{Binding BooksCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"VirtualizingPanel.IsVirtualizing="True"VirtualizingPanel.VirtualizationMode="Recycling"ScrollViewer.IsDeferredScrollingEnabled="True"VirtualizingPanel.CacheLengthUnit="Pixel"VirtualizingPanel.CacheLength="100"><DataGrid.Columns><DataGridTemplateColumn><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid Width="{Binding DataContext.GridWidth,RelativeSource={RelativeSource AncestorType=UserControl}}"Height="{Binding DataContext.GridHeight,RelativeSource={RelativeSource AncestorType=UserControl}}"><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="FontSize" Value="80"/><Setter Property="Foreground" Value="Red"/></Trigger></Style.Triggers></Style></Grid.Resources><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Id}"/><TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Name}"/><TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding Title}"/><TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3"Text="{Binding ISBN}" HorizontalAlignment="Center"/></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid><Button Grid.Row="2"Content="ViewB ReLoad Data"FontSize="50"Command="{Binding LoadDataCommand}"/></Grid> </UserControl>//ViewB.xaml.cs using System; using System.Collections.Generic; 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;namespace WpfApp38.Views {/// <summary>/// Interaction logic for ViewB.xaml/// </summary>public partial class ViewB : UserControl{public ViewB(){InitializeComponent();}} }//ViewModelBViewModel.cs using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Text; using System.Windows.Media; using System.Windows.Media.Imaging; using WpfApp38.Models;namespace WpfApp38.ViewModels {public class ViewBViewModel : BindableBase{System.Timers.Timer tmr;public ViewBViewModel(){InitSlimBooksCollection();LoadDataCommand=new DelegateCommand(LoadDataCommandExecuted); InitVariables();tmr= new System.Timers.Timer();tmr.Elapsed+=Tmr_Elapsed;tmr.Interval=1000;tmr.Start();}private void Tmr_Elapsed(object? sender, System.Timers.ElapsedEventArgs e){ViewBTitle=$"In ViewBTitle,UtcNow is {DateTime.UtcNow.ToString("yyyyMMddHHmmss")}";}private void InitVariables(){var mainWin = System.Windows.Application.Current.MainWindow;if (mainWin!=null){GridWidth= mainWin.ActualWidth;GridHeight= mainWin.ActualHeight/2;}}private void LoadDataCommandExecuted(){bool flowControl = InitSlimBooksCollection();if (!flowControl){return;}}private bool InitSlimBooksCollection(){var dir = @"../../../Images";if (!Directory.Exists(dir)){return false;}var imgs = Directory.GetFiles(dir);if (imgs==null ||!imgs.Any()){return false;}int imgsCount = imgs.Count();BooksCollection=new ObservableCollection<Book>();for (int i = 1; i<1001; i++){BooksCollection.Add(new Book(){Id=i,Name=$"Name_{i}", ISBN=$"ISBN_{i}_{Guid.NewGuid()}",Title=$"Title_{i}",ImgSource=GetImgSourceViaUrl(imgs[i%imgsCount])});}return true;}private ImageSource GetImgSourceViaUrl(string imgUrl){BitmapImage bmi = new BitmapImage();if (!File.Exists(imgUrl)){return bmi;}bmi.BeginInit();bmi.UriSource=new Uri(imgUrl, UriKind.RelativeOrAbsolute);bmi.CacheOption= BitmapCacheOption.OnDemand;bmi.EndInit();bmi.Freeze();return bmi;}public DelegateCommand LoadDataCommand { get; set; }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 viewBTitle;public string ViewBTitle{get{return viewBTitle;}set{SetProperty(ref viewBTitle, value);}}} }