WPF Prism RegionManager Navigate

install-package prism.core;
install-package Prism.DryIoc;
install-package prism.wpf;
//app.xaml
<prism:PrismApplication
             x:Class="WpfApp31.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/">
    <!--<Application.Resources>
        
    </Application.Resources>-->
</prism:PrismApplication>



//App.cs
using System.Windows;
using Prism.DryIoc;

namespace WpfApp31
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return new MainWindow();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<ViewA>("ViewA");
            containerRegistry.RegisterForNavigation<ViewB>("ViewB");
            containerRegistry.RegisterForNavigation<ViewC>("ViewC");
        }
    }

}
//MainWindow.xaml
<Window x:Class="WpfApp31.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:prism="http://prismlibrary.com/"
        xmlns:local="clr-namespace:WpfApp31"
        mc:Ignorable="d"
        WindowState="Maximized"
        Title="MainWindow" Height="450" Width="800"
        prism:ViewModelLocator.AutoWireViewModel="True">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal" Grid.Row="0">
            <Button Content="View A"
                    Margin="5"
                    Command="{Binding NavigateCommand}"
                    CommandParameter="ViewA"/>
            
            <Button Content="View B"
                    Margin="5"
                    Command="{Binding NavigateCommand}"
                    CommandParameter="ViewB"/>
            
            <Button Content="View C"
                    Margin="5"
                    Command="{Binding NavigateCommand}"
                    CommandParameter="ViewC"/>            
        </StackPanel>

        <ContentControl prism:RegionManager.RegionName="MainRegion"
                        Grid.Row="1"/>
    </Grid>
</Window>

//MainWindowViewModel.cs


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp31
{
    public class MainWindowViewModel:BindableBase
    {
        private readonly IRegionManager _regionManager;
        public DelegateCommand<string> NavigateCommand { get; private set; }

        public MainWindowViewModel(IRegionManager regionManager)
        {
            _regionManager = regionManager;
            NavigateCommand = new DelegateCommand<string>(Navigate);
        }

        private void Navigate(string navPath)
        {
            _regionManager.RequestNavigate("MainRegion", navPath, navigationResult =>
            {
                if(!navigationResult.Success)
                {
                    var error = navigationResult.Exception;
                    MessageBox.Show(error?.ToString());
                }
            });
            var parameters = new NavigationParameters();
            parameters.Add("id", 123);
            _regionManager.RequestNavigate("MainRegion", navPath, parameters);
        }
    
    }
}

 

 

 

//ViewA.xaml
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 WpfApp31
{
    /// <summary>
    /// Interaction logic for ViewA.xaml
    /// </summary>
    public partial class ViewA :UserControl
    {
        public ViewA()
        {
            InitializeComponent();
        }
    }
}



//ViewAViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Prism.Mvvm;

namespace WpfApp31
{
    public class ViewAViewModel : BindableBase, INavigationAware
    {
        private string msg;
        public string Msg
        {
            get
            {
                return msg;
            }
            set
            {
                SetProperty(ref msg, value);
            }
        }

        public ViewAViewModel()
        {
            
        }

        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
            
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            if(navigationContext.Parameters.TryGetValue("id",out int id))
            {
                Msg=$"Received ID:{id}";
            }
        }
    }
}

 

 

//viewB.xaml
<UserControl x:Class="WpfApp31.ViewB"
        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:WpfApp31"
        mc:Ignorable="d"
        xmlns:prism="http://prismlibrary.com/"
        Height="450" Width="800">
    <Grid>
        <TextBlock Text="View B"
           FontSize="200"/>
    </Grid>
</UserControl>



//ViewBViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Prism.Mvvm;

namespace WpfApp31
{
    public class ViewBViewModel : BindableBase, INavigationAware
    {
        private string msg;
        public string Msg
        {
            get
            {
                return msg;
            }
            set
            {
                SetProperty(ref msg, value);
            }
        }

        public ViewBViewModel()
        {
            Msg="Default Msg";
        }

        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
             
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            if(navigationContext.Parameters.ContainsKey("msg"))
            {
                Msg=navigationContext.Parameters.GetValue<string>("msg");
            }
        }
    }
}

 

 

 

image

 

 

 

 

image

 

 

 

 

 

 

 

 

 

image

 

posted @ 2025-08-10 22:07  FredGrit  阅读(11)  评论(0)    收藏  举报