Install-Package Prism.DryIOC; Install-Package Prism.Wpf;
Install-Package Microsoft.Xaml.Behaviors.WPF;
//App.xaml <prism:PrismApplication x:Class="WpfApp14.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp14"xmlns:prism="http://prismlibrary.com/"><prism:PrismApplication.Resources><Style TargetType="Button"><Setter Property="FontSize" Value="50"/></Style><Style TargetType="TextBlock"><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></prism:PrismApplication.Resources> </prism:PrismApplication>//App.xaml.cs using System.Configuration; using System.Data; using System.Windows; using WpfApp14.Services; using WpfApp14.ViewModels; using WpfApp14.Views;namespace WpfApp14 {/// <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.Register<IIDService, IDService>();containerRegistry.Register<IISBNService, ISBNService>();containerRegistry.Register<INameService, NameService>();containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>("ViewA");containerRegistry.RegisterForNavigation<ViewB, ViewBViewModel>("ViewB");containerRegistry.RegisterForNavigation<MainWindow, MainWindowViewModel>("MainWindow");}protected override void OnInitialized(){base.OnInitialized();var regionManager = Container.Resolve<IRegionManager>();regionManager.RequestNavigate("MainRegion", "ViewA");}} }
//App.xaml <prism:PrismApplication x:Class="WpfApp14.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp14"xmlns:prism="http://prismlibrary.com/"><prism:PrismApplication.Resources><Style TargetType="Button"><Setter Property="FontSize" Value="50"/></Style><Style TargetType="TextBlock"><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></prism:PrismApplication.Resources> </prism:PrismApplication>//App.xaml.cs using System.Configuration; using System.Data; using System.Windows; using WpfApp14.Services; using WpfApp14.ViewModels; using WpfApp14.Views;namespace WpfApp14 {/// <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.Register<IIDService, IDService>();containerRegistry.Register<IISBNService, ISBNService>();containerRegistry.Register<INameService, NameService>();containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>("ViewA");containerRegistry.RegisterForNavigation<ViewB, ViewBViewModel>("ViewB");containerRegistry.RegisterForNavigation<MainWindow, MainWindowViewModel>("MainWindow");}protected override void OnInitialized(){base.OnInitialized();var regionManager = Container.Resolve<IRegionManager>();regionManager.RequestNavigate("MainRegion", "ViewA");}} }//MainWindow.xaml <Window x:Class="WpfApp14.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:WpfApp14"WindowState="Maximized"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"xmlns:prism="http://prismlibrary.com/"prism:ViewModelLocator.AutoWireViewModel="True"><behavior:Interaction.Triggers><behavior:EventTrigger EventName="MouseMove"><behavior:InvokeCommandActionCommand="{Binding MouseMoveCommand}"/></behavior:EventTrigger></behavior:Interaction.Triggers><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></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"prism:RegionManager.RegionName="MainRegion"VerticalAlignment="Stretch"HorizontalAlignment="Stretch"/><TextBlock Grid.Row="2"Text="{Binding MainStatusMsg}"/></Grid> </Window>//MainWindowViewModel.cs using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Windows; using System.Windows.Input;namespace WpfApp14.ViewModels {public class MainWindowViewModel : BindableBase{IRegionManager regionManager;public MainWindowViewModel(IRegionManager regionManager){this.regionManager = regionManager;NavigateCommand = new DelegateCommand<string>(NavigateCommandExecuted);MouseMoveCommand = new DelegateCommand(MouseMoveCommandExecuted);}private void MouseMoveCommandExecuted(){var pt=Mouse.GetPosition(Application.Current.MainWindow);MainStatusMsg = $"Location:X:{pt.X:F0},Y:{pt.Y:F0}";}private void NavigateCommandExecuted(string viewName){regionManager.RequestNavigate("MainRegion", viewName);}private string mainStatusMsg;public string MainStatusMsg{get{return mainStatusMsg;}set{SetProperty(ref mainStatusMsg, value);}}public DelegateCommand<string> NavigateCommand { get; set; }public DelegateCommand MouseMoveCommand { get; set; }} }//ViewA.xaml <UserControl x:Class="WpfApp14.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:WpfApp14.Views"mc:Ignorable="d" VerticalAlignment="Stretch"HorizontalAlignment="Stretch"xmlns:prism="http://prismlibrary.com/"prism:ViewModelLocator.AutoWireViewModel="True"><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/> </Grid.RowDefinitions><TextBlock Grid.Row="0"Text="{Binding ViewATitle,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"FontSize="50"/><DataGrid Grid.Row="1"ItemsSource="{Binding BooksCollection}"VirtualizingPanel.IsVirtualizing="True"VirtualizingPanel.VirtualizationMode="Recycling"VirtualizingPanel.CacheLengthUnit="Item"VirtualizingPanel.CacheLength="3,3"ScrollViewer.IsDeferredScrollingEnabled="True"ScrollViewer.CanContentScroll="True"><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.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><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="0" Grid.Column="3" Text="{Binding Topic}"/><TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="4" Text="{Binding ISBN}"/></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid></Grid> </UserControl>//ViewAViewModel.cs using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Text; using System.Windows.Media; using System.Windows.Media.Imaging; using WpfApp14.Models; using WpfApp14.Services;namespace WpfApp14.ViewModels {public class ViewAViewModel : BindableBase{IIDService idService;INameService nameService;IISBNService iSBNService;ConcurrentDictionary<string, ImageSource> imgDicCache = new ConcurrentDictionary<string, ImageSource>();public ViewAViewModel(IIDService idServiceValue, INameService nameServiceValue,IISBNService isbnServiceValue){ViewATitle = $"In view A now is {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}";idService = idServiceValue;nameService = nameServiceValue;iSBNService = isbnServiceValue;InitData(); }private void InitData(){InitSize();InitBooksCollection();Task.Run(() =>{InitTimer();}); }private void InitTimer(){System.Timers.Timer tmr=new System.Timers.Timer();tmr.Elapsed += Tmr_Elapsed;tmr.Interval = 1000;tmr.Start();}private void Tmr_Elapsed(object? sender, System.Timers.ElapsedEventArgs e){ViewATitle = $"In view A now is {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}";}private void InitBooksCollection(){var imgDir = @"../../../Images";if (!Directory.Exists(imgDir)){return;}var imgs = Directory.GetFiles(imgDir);if (imgs == null || !imgs.Any()){return;}int imgsCount = imgs.Count();BooksCollection = new ObservableCollection<Book>();for (int i = 1; i < 101; i++){BooksCollection.Add(new Book(){Id = idService.GetID(),Name = nameService.GetName(),ISBN = iSBNService.GetISBN(),Title = $"Title_{i}",Topic = $"Topic_{i}",ImgSource = GetImgSourceViaUrl(imgs[i % imgsCount])});}}private ImageSource GetImgSourceViaUrl(string imgUrl){if (string.IsNullOrEmpty(imgUrl) || !File.Exists(imgUrl)){return null;}if (imgDicCache.TryGetValue(imgUrl, out var img)){return img;}BitmapImage bmi = new BitmapImage();bmi.BeginInit();bmi.UriSource = new Uri(imgUrl, UriKind.RelativeOrAbsolute);bmi.EndInit();bmi.Freeze();imgDicCache[imgUrl] = bmi;return bmi;}private void InitSize(){var mainWin = System.Windows.Application.Current.MainWindow;if (mainWin == null){return;}GridWidth = mainWin.ActualWidth;GridHeight = mainWin.ActualHeight / 2;}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 viewATitle;public string ViewATitle{get{return viewATitle;}set{SetProperty(ref viewATitle, value);}}} }//ViewB.xaml <UserControl x:Class="WpfApp14.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:WpfApp14.Views"mc:Ignorable="d" VerticalAlignment="Stretch"HorizontalAlignment="Stretch"xmlns:prism="http://prismlibrary.com/"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}"/><ListBox Grid.Row="1"ItemsSource="{Binding BooksCollection}"VirtualizingPanel.IsVirtualizing="True"VirtualizingPanel.VirtualizationMode="Recycling"VirtualizingPanel.CacheLengthUnit="Item"VirtualizingPanel.CacheLength="3,3"ScrollViewer.IsDeferredScrollingEnabled="True"ScrollViewer.CanContentScroll="True"><ListBox.ItemTemplate><DataTemplate><Grid Height="{Binding DataContext.GridHeight,RelativeSource={RelativeSource AncestorType=UserControl}}"Width="{Binding DataContext.GridWidth,RelativeSource={RelativeSource AncestorType=UserControl}}"><Grid.Background><ImageBrush ImageSource="{Binding ImgSource}"/></Grid.Background><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><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="0" Grid.Column="3" Text="{Binding Topic}"/><TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="4" Text="{Binding ISBN}"/></Grid></DataTemplate></ListBox.ItemTemplate></ListBox></Grid> </UserControl>//ViewBViewModel.cs using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Text; using System.Windows.Media; using System.Windows.Media.Imaging; using WpfApp14.Models; using WpfApp14.Services;namespace WpfApp14.ViewModels {public class ViewBViewModel : BindableBase{IIDService idService;INameService nameService;IISBNService isbnService;ConcurrentDictionary<string, ImageSource> imgDicCache = new ConcurrentDictionary<string, ImageSource>();public ViewBViewModel(IIDService idServiceValue, INameService nameServiceValue,IISBNService isbnServiceValue){ViewBTitle = $"In view B";idService = idServiceValue;nameService = nameServiceValue;isbnService = isbnServiceValue;InitData();}private void InitData(){InitSize();InitBooksCollection();Task.Run(() =>{InitTimer();});}private void InitTimer(){System.Timers.Timer 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 view B now is {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}";}private void InitBooksCollection(){var imgDir = @"../../../Images";if (!Directory.Exists(imgDir)){return;}var imgs = Directory.GetFiles(imgDir);if (imgs == null || !imgs.Any()){return;}int imgsCount = imgs.Count();BooksCollection = new ObservableCollection<Book>();for (int i = 1; i < 101; i++){BooksCollection.Add(new Book(){Id = idService.GetID(),Name = nameService.GetName(),ISBN = isbnService.GetISBN(),Title = $"Title_{i}",Topic = $"Topic_{i}",ImgSource = GetImgSourceViaUrl(imgs[i % imgsCount])});}}private ImageSource GetImgSourceViaUrl(string imgUrl){if (string.IsNullOrEmpty(imgUrl) || !File.Exists(imgUrl)){return null;}if (imgDicCache.TryGetValue(imgUrl, out var img)){return img;}BitmapImage bmi = new BitmapImage();bmi.BeginInit();bmi.UriSource = new Uri(imgUrl, UriKind.RelativeOrAbsolute);bmi.EndInit();bmi.Freeze();imgDicCache[imgUrl] = bmi;return bmi;}private void InitSize(){var mainWin = System.Windows.Application.Current.MainWindow;if (mainWin == null){return;}GridWidth = mainWin.ActualWidth;GridHeight = mainWin.ActualHeight / 4;}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);}}} }//IDService.cs using System; using System.Collections.Generic; using System.Text;namespace WpfApp14.Services {public interface IIDService{int GetID();}public class IDService:IIDService{int id = 0;public int GetID(){return Interlocked.Increment(ref id);}} }//NameService.cs using System; using System.Collections.Generic; using System.Text;namespace WpfApp14.Services {public interface INameService{string GetName();}public class NameService:INameService{int idx = 0;public string GetName(){return $"Name_{Interlocked.Increment(ref idx)}";}} }//ISBNService.cs using System; using System.Collections.Generic; using System.Text;namespace WpfApp14.Services {public interface IISBNService{string GetISBN();}public class ISBNService : IISBNService{int idx = 0;public string GetISBN(){return $"ISBN_{++idx}_{Guid.NewGuid():N}";}} }//Models/Book.cs using System; using System.Collections.Generic; using System.Text; using System.Windows.Media;namespace WpfApp14.Models {public class Book{public int Id { get; set; }public string Name { get; set; }public string Title { get; set; }public string Topic { get; set; }public string ISBN { get; set; }public ImageSource ImgSource { get; set; }} }