惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Vercel News
Vercel News
C
Check Point Blog
G
Google Developers Blog
博客园 - 司徒正美
量子位
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
A
About on SuperTechFans
美团技术团队
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
Y
Y Combinator Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Cloudflare Blog
U
Unit 42

博客园 - FredGrit

WPF customize via three combied custom controls WPF DataGrid DataGridTemplateColumn DataTemplate ContentPresenter ContentTemplate WPF Customcontrol NumUpDownScroller WPF CustomControl override Template in Generic.xaml and invoke different style WPF HierarchicalDataTemplate customize via ToggleButton WPF DataGrid DataGridTemplateColumn DataTemplate call predefined DataTemplate via ContentPresenter and ContentTemplate WPF ListBox load data via contentcontrol an ItemTemplate WPF DataGrid load data from Asp.Net Core WebAPI WPF TreeView HierarchicalDataTemplate with grouped Data WPF display grouped data with GroupBox and ItemsControl WPF two listbox scroll syncchronously via behavior WPF invoke data from WebAPI,DataGridTemplate call pre defined DataTemplate via ContentPresenter WPF ListBox load data from WCF WPF datagrid load data from WCF via json, export selected items to json file WPF ItemsControl load data from WCF,DataTemplate, ContentControl WPF customize rotated wheel relentlessly via custom control WPF embed DataTemplate in HierchicalDataTemplate of TreeView WPF ContentControl, ItemsControl, ItemsPanelTemplate,VirtualizingStackPanel,convert xml string to List<T> WPF parse web.config recursively, TreeView and HierarchicalDataTemplate WPF Custom control in cs and Generic.xaml WPF ContextMenu independent visual tree resolved via Freezable implemented class WPF custom control GetTemplateChild vs FindName,NameScope separation between Logical Tree and Visual Tree, WPF ListBox ListView Datatemplate, parse xml to List via XmlSerializer and StringReader WPF TreeView HierarchicalDataTemplate, parse xml via traverse in XmlElement WPF parse xml via [XmRoot] and [XmlElement] attributes together, contentcontrol's template is ControlTemplate from Resources WPF ContentControl invoke Template from resource, reuse datatemplate WPF deserialize xml string as List via [XmlRoot] and [XmlElement] attribute WPF ContentControl Template WPF DatagridTemplate Binding DataTemplate WPF TreeView explicitly given key name to HierarchicalDataTemplate
WPF Prism.Core version 9.0.537 implemented navigation reg...
FredGrit · 2026-05-13 · via 博客园 - FredGrit
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); } } } }

image

image

image

image

image

image

image