2022學習WPF初識MVVM框架prism完成菜單切換


  1. 首先新建一個wpf項目,選擇最新的.net5.然后在包管理器里面安裝 Prism.DryIoc包。就包含了Prism框架和容器。
  2. 我們在主窗體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> 
    View Code

     

    同時在窗體聲明的xml文檔里面加上  xmlns:prism="http://prismlibrary.com/" ,對Prism的引用,我們對每個按鈕設置了command命令,並指定了參數。這里很關鍵。

  3. 我們在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>();
            }
        }
    View Code

    最后我們定義一個類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);
       }
    }
View Code

最后我們需要指定窗體的data。   this.DataContext = new MainViewModel(_regionManager);  當然這里,也需要構造函數注入的形式,注入IRegionManger。

好了,我通過點擊不同button,可以顯示不同窗體下的內容,我們是通過名稱參數傳遞的,最終效果如下,

 

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM