





















Install-Package Prism.Core -v 9.0.537 Install-Package Prism.Wpf -v 9.0.537 Install-Package Prism.DryIoc -v 9.0.537
<prism:PrismApplication x:Class="WpfApp29.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism="http://prismlibrary.com/" ShutdownMode="OnExplicitShutdown"> <prism:PrismApplication.Resources> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="30"/> <Setter Property="HorizontalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/> </Style> <Style TargetType="TextBox"> <Setter Property="FontSize" Value="30"/> <Setter Property="HorizontalAlignment" Value="Stretch"/> <Setter Property="VerticalAlignment" Value="Stretch"/> </Style> </prism:PrismApplication.Resources> </prism:PrismApplication> using Prism.DryIoc; using Prism.Ioc; using System.Windows; using WpfApp29.ViewModels; using WpfApp29.Views; namespace WpfApp29 { public partial class App : PrismApplication { public App() { Application.Current.Dispatcher.UnhandledException += Dispatcher_UnhandledException; Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; } protected override void OnStartup(StartupEventArgs e) { var splash = new SplashWin(); splash.ShowDialog(); base.OnStartup(e); } private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { string exMsg = $"{DateTime.Now},{e.Exception.StackTrace}"; MessageBox.Show(exMsg); e.Handled = true; } private void Dispatcher_UnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { string exMsg = $"{DateTime.Now},{e.Exception.StackTrace}"; MessageBox.Show(exMsg); e.Handled = true; } protected override Window CreateShell() { return new MainWin(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterSingleton<BooksViewModel>(); //containerRegistry.RegisterForNavigation<MainWin,MainWinViewModel>(); containerRegistry.RegisterForNavigation<Books, BooksViewModel>("Books"); containerRegistry.RegisterForNavigation<AddBook, AddBookViewModel>("AddBook"); containerRegistry.RegisterForNavigation<EditBooks, EditBooksViewModel>("EditBook"); } protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings) { base.ConfigureRegionAdapterMappings(regionAdapterMappings); } } } using System; using System.Collections.Generic; using System.Text; using System.Windows; namespace WpfApp29.ViewModels { public class MainWinViewModel : BindableBase { private IRegionManager regionManager; private BooksViewModel booksVM; public DelegateCommand ViewBooksCommand => new DelegateCommand(ViewBooksCommandExecuted); public DelegateCommand AddBookCommand => new DelegateCommand(AddBookCommandExecuted); public DelegateCommand EditBookCommand => new DelegateCommand(EditBookCommandExecuted); private void AddBookCommandExecuted() { Navigate("AddBook"); } private void EditBookCommandExecuted() { if(booksVM.SelectedBk==null) { MessageBox.Show("No book selected"); return; } Navigate("EditBook"); } private void ViewBooksCommandExecuted() { Navigate("Books"); } public MainWinViewModel(IRegionManager regionManagerValue,BooksViewModel bookVMValue) { regionManager = regionManagerValue; booksVM = bookVMValue; NavigateOnLoaded(); } private async void NavigateOnLoaded() { await Task.Delay(1); Navigate("Books"); } private void Navigate(string viewName) { regionManager.RequestNavigate("ContentRegion", viewName); } } }
//D:\C\WpfApp29\WpfApp29\App.xaml <prism:PrismApplication x:Class="WpfApp29.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism="http://prismlibrary.com/" ShutdownMode="OnExplicitShutdown"> <prism:PrismApplication.Resources> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="30"/> <Setter Property="HorizontalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/> </Style> <Style TargetType="TextBox"> <Setter Property="FontSize" Value="30"/> <Setter Property="HorizontalAlignment" Value="Stretch"/> <Setter Property="VerticalAlignment" Value="Stretch"/> </Style> </prism:PrismApplication.Resources> </prism:PrismApplication> //D:\C\WpfApp29\WpfApp29\App.xaml.cs using Prism.DryIoc; using Prism.Ioc; using System.Windows; using WpfApp29.ViewModels; using WpfApp29.Views; namespace WpfApp29 { public partial class App : PrismApplication { public App() { Application.Current.Dispatcher.UnhandledException += Dispatcher_UnhandledException; Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; } protected override void OnStartup(StartupEventArgs e) { var splash = new SplashWin(); splash.ShowDialog(); base.OnStartup(e); } private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { string exMsg = $"{DateTime.Now},{e.Exception.StackTrace}"; MessageBox.Show(exMsg); e.Handled = true; } private void Dispatcher_UnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) { string exMsg = $"{DateTime.Now},{e.Exception.StackTrace}"; MessageBox.Show(exMsg); e.Handled = true; } protected override Window CreateShell() { return new MainWin(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterSingleton<BooksViewModel>(); //containerRegistry.RegisterForNavigation<MainWin,MainWinViewModel>(); containerRegistry.RegisterForNavigation<Books, BooksViewModel>("Books"); containerRegistry.RegisterForNavigation<AddBook, AddBookViewModel>("AddBook"); containerRegistry.RegisterForNavigation<EditBooks, EditBooksViewModel>("EditBook"); } protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings) { base.ConfigureRegionAdapterMappings(regionAdapterMappings); } } } //D:\C\WpfApp29\WpfApp29\Views\SplashWin.xaml <Window x:Class="WpfApp29.Views.SplashWin" 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:WpfApp29.Views" mc:Ignorable="d" Title="SplashWin" WindowState="Maximized"> <Grid> <Grid MouseDown="Button_Click"> <Grid.Background> <ImageBrush ImageSource="pack://application:,,,/WpfApp29;component/Resources/Images/333.jpg" /> </Grid.Background> </Grid> </Grid> </Window>
//D:\C\WpfApp29\WpfApp29\Views\SplashWin.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.Shapes;
namespace WpfApp29.Views
{
/// <summary>
/// Interaction logic for SplashWin.xaml
/// </summary>
public partial class SplashWin : Window
{
public SplashWin()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//DialogResult = true;
this.Close();
}
}
}
//D:\C\WpfApp29\WpfApp29\Views\MainWin.xaml <Window x:Class="WpfApp29.Views.MainWin" 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:WpfApp29.Views" xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True" mc:Ignorable="d" Title="MainWin" WindowState="Maximized"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <StackPanel Grid.Row="0" Orientation="Horizontal" Margin="10" HorizontalAlignment="Left"> <Button Content="BooksView" Command="{Binding ViewBooksCommand}" Margin="5"/> <Button Content="Add Book" Command="{Binding AddBookCommand}" Margin="5"/> <Button Content="Edit Book" Command="{Binding EditBookCommand}" Margin="5"/> </StackPanel> <ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" Margin="10"/> </Grid> </Window> //D:\C\WpfApp29\WpfApp29\ViewModels\MainWinViewModel.cs using System; using System.Collections.Generic; using System.Text; using System.Windows; namespace WpfApp29.ViewModels { public class MainWinViewModel : BindableBase { private IRegionManager regionManager; private BooksViewModel booksVM; public DelegateCommand ViewBooksCommand => new DelegateCommand(ViewBooksCommandExecuted); public DelegateCommand AddBookCommand => new DelegateCommand(AddBookCommandExecuted); public DelegateCommand EditBookCommand => new DelegateCommand(EditBookCommandExecuted); private void AddBookCommandExecuted() { Navigate("AddBook"); } private void EditBookCommandExecuted() { if(booksVM.SelectedBk==null) { MessageBox.Show("No book selected"); return; } Navigate("EditBook"); } private void ViewBooksCommandExecuted() { Navigate("Books"); } public MainWinViewModel(IRegionManager regionManagerValue,BooksViewModel bookVMValue) { regionManager = regionManagerValue; booksVM = bookVMValue; NavigateOnLoaded(); } private async void NavigateOnLoaded() { await Task.Delay(1); Navigate("Books"); } private void Navigate(string viewName) { regionManager.RequestNavigate("ContentRegion", viewName); } } } //D:\C\WpfApp29\WpfApp29\Views\AddBooks.xaml <UserControl x:Class="WpfApp29.Views.AddBook" 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:WpfApp29.Views" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" Text="Id:"/> <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding NewBook.Id}"/> <TextBlock Grid.Row="1" Grid.Column="0" Text="Name:"/> <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding NewBook.Name}"/> <TextBlock Grid.Row="2" Grid.Column="0" Text="ISBN:"/> <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding NewBook.ISBN}"/> <Button Grid.Row="3" Grid.Column="0" Content="Cancel" Command="{Binding CancelCommand}"/> <Button Grid.Row="3" Grid.Column="1" Content="Save" Command="{Binding SaveCommand}"/> </Grid> </UserControl> //D:\C\WpfApp29\WpfApp29\ViewModels\AddBookViewModel.cs using System; using System.Collections.Generic; using System.Text; using WpfApp29.Models; namespace WpfApp29.ViewModels { public class AddBookViewModel : BindableBase,INavigationAware { private BooksViewModel booksVM; public DelegateCommand CancelCommand => new DelegateCommand(CancelCommandExecuted); public DelegateCommand SaveCommand => new DelegateCommand(SaveCommandExecuted); public AddBookViewModel(BooksViewModel booksVMValue) { booksVM = booksVMValue; InitNewBook(); } private void CancelCommandExecuted() { return; } private void SaveCommandExecuted() { if (NewBook != null && NewBook.Id > 0) { booksVM.BooksCollection.Add(NewBook); } InitNewBook(); } public void OnNavigatedTo(NavigationContext navigationContext) { InitNewBook(); } private void InitNewBook() { NewBook = new Book(); var lastBk = booksVM.BooksCollection.LastOrDefault(); NewBook.Id = lastBk != null ? lastBk.Id + 1 : 1; } public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { } private Book newBook; public Book NewBook { get { return newBook; } set { SetProperty(ref newBook, value); } } } } //D:\C\WpfApp29\WpfApp29\Views\Books.xaml <UserControl x:Class="WpfApp29.Views.Books" 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:WpfApp29.Views" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <Grid> <DataGrid ItemsSource="{Binding BooksCollection}" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling" VirtualizingPanel.CacheLength="2,2" VirtualizingPanel.CacheLengthUnit="Item" EnableColumnVirtualization="True" EnableRowVirtualization="True" ScrollViewer.CanContentScroll="True" ScrollViewer.IsDeferredScrollingEnabled="True" SnapsToDevicePixels="True" UseLayoutRounding="True" AutoGenerateColumns="True" CanUserAddRows="False" IsReadOnly="True" SelectionMode="Single" SelectedItem="{Binding SelectedBk,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> <DataGrid.Resources> <Style TargetType="DataGridRow"> <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> </DataGrid.Resources> </DataGrid> </Grid> </UserControl> //D:\C\WpfApp29\WpfApp29\ViewModels\BooksViewModel.cs using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Dynamic; using System.Printing; using System.Text; using WpfApp29.Models; namespace WpfApp29.ViewModels { public class BooksViewModel : BindableBase { private static long idx = 0; private static readonly object objLock = new object(); private static long GetIdx() { return Interlocked.Increment(ref idx); } public BooksViewModel() { InitBooksCollection(); } private void InitBooksCollection() { BooksCollection = new ObservableCollection<Book>(); for (int i = 0; i < 100; i++) { var a = GetIdx(); BooksCollection.Add(new Book() { Id = a, Name = $"Name_{a}", ISBN = $"ISBN_{a}_{Guid.NewGuid():N}" }); } } private ObservableCollection<Book> booksCollection; public ObservableCollection<Book> BooksCollection { get { return booksCollection; } set { SetProperty(ref booksCollection, value); } } private Book selectedBk; public Book SelectedBk { get { return selectedBk; } set { SetProperty(ref selectedBk, value); } } } } //D:\C\WpfApp29\WpfApp29\Views\EditBooks.xaml <UserControl x:Class="WpfApp29.Views.EditBooks" 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:WpfApp29.Views" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" Text="Id:"/> <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding SelectedBook.Id, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> <TextBlock Grid.Row="1" Grid.Column="0" Text="Name:"/> <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding SelectedBook.Name, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> <TextBlock Grid.Row="2" Grid.Column="0" Text="ISBN:"/> <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding SelectedBook.ISBN, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> <Button Grid.Row="3" Grid.Column="0" Content="Cancel" Command="{Binding CancelCommand}"/> <Button Grid.Row="3" Grid.Column="1" Content="Update" Command="{Binding UpdateCommand}"/> </Grid> </UserControl> //D:\C\WpfApp29\WpfApp29\ViewModels\EditBooksViewModel.cs using System; using System.Collections.Generic; using System.Text; using System.Windows; using WpfApp29.Models; namespace WpfApp29.ViewModels { public class EditBooksViewModel : BindableBase, INavigationAware { public DelegateCommand CancelCommand { get; set; } public DelegateCommand UpdateCommand { get; set; } private BooksViewModel booksVM; public EditBooksViewModel(BooksViewModel booksVMValue) { CancelCommand = new DelegateCommand(CancelCommandExecuted); UpdateCommand = new DelegateCommand(UpdateCommandExecuted); booksVM= booksVMValue; SelectedBook = booksVM.SelectedBk; } private void UpdateCommandExecuted() { int selectedIdx = booksVM.BooksCollection.IndexOf(SelectedBook); if(selectedIdx>=0) { booksVM.BooksCollection.RemoveAt(selectedIdx); booksVM.BooksCollection.Insert(selectedIdx, SelectedBook); MessageBox.Show($"{DateTime.Now},update BookId:{SelectedBook.Id} successfully"); } } private void CancelCommandExecuted() { return; } public void OnNavigatedTo(NavigationContext navigationContext) { SelectedBook = booksVM.SelectedBk; } public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } public void OnNavigatedFrom(NavigationContext navigationContext) { } private Book selectedBook; public Book SelectedBook { get { return selectedBook; } set { SetProperty(ref selectedBook, value); } } } }







此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。