WPF Prism PrismApplication OnInitialized()
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); } } } }