- 首先新建一個wpf項目,選擇最新的.net5.然后在包管理器里面安裝 Prism.DryIoc包。就包含了Prism框架和容器。
- 我們在主窗體mainview里面新建兩行,一行放按鈕,一行放內容,顯示動態切換的內容,內容呢來自於2個不同的用戶控件 ,然后我們在內容里面設置prism的區域,並指定名稱,代碼如下
<Grid.RowDefinitions> <RowDefinition Height="auto"></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal"> <Button Margin="5" Content="打開模塊BtnA" Command="{Binding OpenCommand}" CommandParameter="WindowA"></Button> <Button Margin="5" Content="打開模塊BtnB" Command="{Binding OpenCommand}" CommandParameter="WindowB"></Button> </StackPanel> <ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" ></ContentControl>
同時在窗體聲明的xml文檔里面加上 xmlns:prism="http://prismlibrary.com/" ,對Prism的引用,我們對每個按鈕設置了command命令,並指定了參數。這里很關鍵。
- 我們在app.xaml.cs里面讓我們的app這個類繼承PrismApplication,這樣我們就是我們就可以重載他里面的兩個函數,一個是注冊Navigation,這里我們注冊windowA和windowB。另外一個是CreateShell。完整代碼如下
public partial class App : PrismApplication { protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation<WindowA>(); containerRegistry.RegisterForNavigation<WindowB>(); } protected override Window CreateShell() { return Container.Resolve<MainView>(); } }
最后我們定義一個類MainVieModel來承載窗體的數據。這個類需要繼承BindableBase。然后定義一個 IRegionManager,通過構造函數注入進來,我們定義一個命令的屬性,名稱OpenCommad,類型是DelegateCommand,這是一個委托,可以定義是一個輸入string類型的輸入參數DelegateCommand<string>,然后在構造函數里面我們進行實例化,傳入一個方法,方法的定義里面,可以根據 IRegionManger的找到所有的區域,然后根據區域名稱找到我們頁面上定義的區域,通過RequestNavgate方法,傳入名稱。就是方法的參數。代碼如下

public class MainViewModel:BindableBase { private readonly IRegionManager _regionManager; public DelegateCommand<string> OpenCommand { get; private set; } public MainViewModel(IRegionManager regionManager) { _regionManager = regionManager; OpenCommand = new DelegateCommand<string>(Open); } private void Open(string obj) { //根據名字找到區域 _regionManager.Regions["ContentRegion"].RequestNavigate(obj); } }
最后我們需要指定窗體的data。 this.DataContext = new MainViewModel(_regionManager); 當然這里,也需要構造函數注入的形式,注入IRegionManger。
好了,我通過點擊不同button,可以顯示不同窗體下的內容,我們是通過名稱參數傳遞的,最終效果如下,