DUICUO

WPF フレームワーク Prism を徹底的に理解するのに役立つ、.NET Core 3.1 に基づく C# オープンソース プロジェクト。

概要

このプロジェクトでは、WPFでPrismの様々な機能を使用する方法の例を示します。Prismを初めて使用する場合は、最初の例から始めて、リストの順に進めていくことをお勧めします。各例は、前の例の概念に基づいて構築されています。

このプロジェクトのプラットフォーム フレームワークは .NET Core 3.1 です。

プリズムバージョン: 8.0.0.1909

注: これらのプロジェクトはすべて同じソリューションに属しているため、順番に開いて実行する必要があります。プロジェクトを選択し、右クリックして「スタートアッププロジェクトを設定」を選択し、実行してください。

目次

トピック

説明する

ブートストラッパーとシェル

基本的なブートローダーとシェルを作成します。

地域

地域を作成する

カスタムリージョンアダプタ

StackPanel用のカスタムリージョンアダプタを作成する

ディスカバリーを見る

ビューを使用して、ビューを検出し、自動的に挿入します。

ビューインジェクション

ビュー インジェクションを使用してビューを手動で追加および削除します。

有効化/無効化の表示

ビューを手動で有効または無効にする

App.config を使用したモジュール

アプリケーションを使用してモジュールをロードします。構成ファイル。

コード付きモジュール

コードを使用してモジュールをロードする

ディレクトリ付きモジュール

ディレクトリからモジュールをロードする

手動でロードされたモジュール

IModuleManager を使用してモジュールを手動でロードする

ビューモデルロケーター

ViewModelLocatorの使用

ViewModelLocator - 規約の変更

ViewModelLocator の命名規則を変更する

ViewModelLocator - カスタム登録

特定のビューのViewModelを手動で登録する

委任コマンド

DelegateCommand と DelegateCommand<T> を使用する

複合コマンド

CompositeCommands を使用して複数のコマンドを 1 つのコマンドとして呼び出す方法を学習します。

IActiveAware コマンド

IActiveAware コマンドがアクティブ コマンドのみを呼び出すようにします。

イベントアグリゲーター

IEventAggregatorの使用

イベントアグリゲータ - イベントのフィルタリング

イベントをサブスクライブするときにイベントをフィルタリングする

リージョンコンテキスト

ネストされた領域にデータを渡したい場合は、RegionContext を使用します。

地域ナビゲーション

基本的なエリアナビゲーションの実装方法を参照してください。

ナビゲーションコールバック

ナビゲーションが完了したら通知を受け取る

ナビゲーション参加

INaviationAware によるビューとビューモデルのナビゲーション参加の理解

既存のビューに移動する

ナビゲーション中にビューインスタンスを制御する

パラメータの受け渡し

あるビュー/ビューモデルから別のビュー/ビューモデルにパラメータを渡す

ナビゲーションの確認/キャンセル

ナビゲーションを確認またはキャンセルするには、IConfirmNavigationRequest インターフェイスを使用します。

ビューの有効期間の制御

IRegionMemberLifetime を使用してメモリからビューを自動的に削除します。

ナビゲーションジャーナル

ナビゲーションログの使い方を学ぶ

プロジェクトの一部デモンストレーションと紹介

① BootstrapperShell 起動画面:

これは主に Prism フレームワークの使用方法を示しています。

ステップ 1: NuGet で Prisim.Unity を参照します。

ステップ 2: App.xaml を変更して、ブートローダーを設定します。

 <アプリケーション x:Class="BootstrapperShell.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BootstrapperShell">
<アプリケーション.リソース>

</アプリケーション.リソース>
</アプリケーション>
パブリック部分クラス App: アプリケーション
{
保護されたオーバーライド void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);

var bootstrapper = new Bootstrapper();
ブートストラップを実行します。
}
}

ステップ 3: ブートローダーでスタートアップ項目を設定します。

 Unity を使用します。
Prism.Unity を使用します。
BootstrapperShell.Views を使用します。
System.Windows を使用します。
Prism.Ioc を使用します。

名前空間BootstrapperShell
{
クラス Bootstrapper: PrismBootstrapper
{
保護されたオーバーライド DependencyObject CreateShell()
{
Container.Resolve<MainWindow>() を返します。
}

保護されたオーバーライド void RegisterTypes(IContainerRegistry containerRegistry)
{

}
}
}

ステップ 4: MainWindow.xaml に文字列を表示します。

 <ウィンドウ x:Class="BootstrapperShell.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
タイトル="シェル" 高さ="350" 幅="525">
<グリッド>
<ContentControl Content="Prism からこんにちは" />
</グリッド>
</ウィンドウ>

②ViewInjection: ビューの登録

MainWindow.xaml: ContentControl を介してビューを関連付けます。

 <ウィンドウ x:Class="ViewInjection.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
タイトル="シェル" 高さ="350" 幅="525">
<DockPanel LastChildFill="True">
<Button DockPanel.Dock="Top" Click="Button_Click">ビューを追加</Button>
<ContentControl プリズム:RegionManager.RegionName="コンテンツ領域" />
</ドックパネル>
</ウィンドウ>

MainWindow.xaml.cs: マウスをクリックした後、IRegion インターフェイスを介してビューを登録します。

パブリック部分クラス MainWindow: Window
{
IContainerExtension_コンテナ;
IRegionManager _regionManager;

パブリック MainWindow(IContainerExtension コンテナ、IRegionManager リージョンマネージャー)
{
コンポーネントを初期化します();
_container = コンテナ;
_regionManager = 地域マネージャー;
}

プライベートvoid Button_Click(オブジェクト送信者、RoutedEventArgs e)
{
var view = _container.Resolve<ViewA>();
IRegion リージョン = _regionManager.Regions["コンテンツリージョン"];
region.Add(ビュー);
}
}

③ActivationDeactivation: 有効化と無効化の表示

MainWindow.xaml.cs: ここでは、コンテナ拡張インターフェースとレジストラインターフェースがフォームコンストラクタに注入されています。これらはそれぞれビューの読み込みとレジストラの登録に使用されます。フォームのアクティブ化と非アクティブ化は、それぞれ領域のActivateメソッドとDeactivateメソッドによって実装されています。

パブリック部分クラス MainWindow: Window
{
IContainerExtension_コンテナ;
IRegionManager _regionManager;
IRegion _region;

ビューA _viewA;
ビューB _viewB;

パブリック MainWindow(IContainerExtension コンテナ、IRegionManager リージョンマネージャー)
{
コンポーネントを初期化します();
_container = コンテナ;
_regionManager = 地域マネージャー;

this.Loaded += MainWindow_Loaded;
}

プライベート void MainWindow_Loaded(オブジェクト送信者、RoutedEventArgs e)
{
_viewA = _container.Resolve<ViewA>();
_viewB = _container.Resolve<ViewB>();

_region = _regionManager.Regions["コンテンツリージョン"];

_region.Add(_viewA);
_region.Add(_viewB);
}

プライベート void Button_Click(オブジェクト送信者、RoutedEventArgs e)
{
//ビューをアクティブ化する
_region.Activate(_viewA);
}

プライベートvoid Button_Click_1(オブジェクト送信者、RoutedEventArgs e)
{
//ビューaを非アクティブ化する
_region.Deactivate(_viewA);
}

プライベート void Button_Click_2(オブジェクト送信者、RoutedEventArgs e)
{
//ビューbをアクティブ化する
_region.Activate(_viewB);
}

プライベートvoid Button_Click_3(オブジェクト送信者、RoutedEventArgs e)
{
//ビューbを非アクティブ化する
_region.Deactivate(_viewB);
}
}

④EventAggregatorの使用:イベントの公開と購読

イベントクラスの定義:

パブリッククラス MessageSentEvent : PubSubEvent<文字列>
{
}

2 つのコンポーネント、ModuleA と ModuleB を登録します。

保護されたオーバーライド void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
モジュールカタログ.AddModule<ModuleA.ModuleAModule>();
moduleCatalog.AddModule<ModuleB.ModuleBModule>();
}

ModuleAModule にビュー MessageView を登録します

パブリッククラス ModuleAModule: IModule
{
パブリック void OnInitialized(IContainerProvider コンテナプロバイダー)
{
varregionManager =containerProvider.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("左リージョン", typeof(MessageView));
}

パブリック void RegisterTypes(IContainerRegistry コンテナレジストリ)
{

}
}

MessageView.xaml: ビュー内のボタン「俺妞妞」にコマンドをバインドします。

 <UserControl x:Class="ModuleA.Views.MessageView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
プリズム:ViewModelLocator.AutoWireViewModel="True" パディング="25">
<スタックパネル>
<TextBox Text="{Binding Message}" Margin="5"/>
<Button Command="{Binding SendMessageCommand}" Content="メッセージの送信" Margin="5"/>
</スタックパネル>
</ユーザーコントロール>

MessageViewModel.cs: VM では、インターフェイスにバインドされたコマンドが SendMessage に委任され、その後、メッセージが SendMessage メソッドで公開されます。

 Prism.Commands を使用します。
Prism.Events を使用します。
Prism.Mvvm を使用します。
UsingEventAggregator.Core を使用します。

名前空間ModuleA.ViewModels
{
パブリッククラス MessageViewModel: BindableBase
{
Iイベントアグリゲーター _ea;

private string _message = "送信するメッセージ";
公開文字列メッセージ
{
取得{_messageを返す;}
設定 { SetProperty(ref _message, value); }
}

パブリック DelegateCommand SendMessageCommand { 取得; プライベート設定; }

パブリック MessageViewModel(IEventAggregator ea)
{
_ea = ea;
SendMessageCommand = 新しい DelegateCommand(SendMessage);
}

プライベート void SendMessage()
{
_ea.GetEvent<MessageSentEvent>().Publish(メッセージ);
}
}
}

MessageListViewModel で受信したメッセージを受信して​​表示します。

パブリッククラス MessageListViewModel: BindableBase
{
Iイベントアグリゲーター _ea;

プライベートObservableCollection<文字列>_messages;
public ObservableCollection<string> メッセージ
{
取得{_messagesを返す;}
設定 { SetProperty(ref _messages, value); }
}

パブリック MessageListViewModel(IEventAggregator ea)
{
_ea = ea;
メッセージ = 新しい ObservableCollection<string>();

_ea.GetEvent<MessageSentEvent>().Subscribe(MessageReceived);
}

プライベートvoid MessageReceived(文字列メッセージ)
{
Messages.Add(メッセージ);
}
}

これらは、このオープンソース プロジェクトのより典型的な入門例の一部です。他の例についてはこれ以上説明しません。