Using_Prism.Unity_with_WPF)?
PrismとUnityを使うWPFプロジェクトテンプレートを使ってみる
C#WPFXamlMVVMPRISM
7
PrismとUnityを使うWPFプロジェクトテンプレートを使ってみる
Visual Studioの拡張機能の「Prism Template Pack」
Prism Template Packには、WPFを構築するためのスニペット、アイテムテンプレート、およびプロジェクトテンプレートのコレクションと、Prismを使用するXamarin.Formsアプリケーションが含まれています。
注:Xamarin.Formsテンプレートをインストールするには、最新バージョンのXamarinが必要です。
とのこと。
まずは、ダウンロード•VisualStudio?を起動 •ツール > 拡張機能と更新プログラム を選択 •オンラインタブ > 検索条件に「Prism Template Pack」を入力 •検索が表示されたら「Prism Template Pack」をダウンロード •VisualStudio?を再起動するとインストールが始まります。
※2017/04/14に1.10が公開されています。VisualStudio2017にも対応している模様 WS000009.JPG
何ができる?
スニペット:•propp - BindableBase?に依存するバッキングフィールドを持つプロパティ ※通知を伝播させる時に使用 •cmd - プライベートセッターでDelegateCommand?プロパティ •cmdg - 汎用のDelegateCommand? プロパティ ※パラメータ有りのDelegateCommand?の場合に使用
スニペットの例: ↓これを入力 propp タブキー2打後 private string fieldName; public string PropertyName { get { return fieldName; } set { SetProperty(ref fieldName, value); } }
アイテムテンプレート: •Prism ViewModel? - BindableBase?から派生し、デフォルトコンストラクタを持つViewModel? •Prism UserControl? - ViewModelLocator?を使用したUserControl? •Prism Window - ViewModelLocator?を使ったWindow
プロジェクトテンプレート:•Prism Module - WPF Prismアプリケーションにモジュールを追加するプロジェクト •Prism Autofac App - PrismとAutofacでWPFアプリケーションを構築するためのプロジェクトテンプレート •Prism Ninject App - PrismとNinjectを使用してWPFアプリケーションを構築するためのプロジェクトテンプレート •Prism StructureMap? App - PrismとStructureMap?を使用してWPFアプリケーションを構築するためのプロジェクトテンプレート •Prism Unity App - PrismとUnityを使ってWPFアプリケーションを構築するためのプロジェクトテンプレート
xamarinも対応していますが、ここでは説明省略。
今回は、Prism Unity Appを使用します。
プロジェクトの作成•新しいプロジェクト > テンプレート > Prism > WPF > Prism Unity App(WPF)を選択。 •プロジェクト名を入力
PrismUnityApp?.jpg こんな感じで、ディレクトリ構成やBootstrapperクラスも作ってくれます。
モジュールの追加•ソリューションを右クリック > 新しい項目 > Prism Module(WPF)を選択
WS000013.JPG
Prismモジュールを追加をするとこんな感じに
PrismUnityApp2.jpg
ちょっと作成
1.プロジェクトテンプレートでPrism Moduleを追加•上の方で説明しましたがモジュールもプロジェクトテンプレートがあるので、そちらから追加をしておけば、Viewsフォルダなんかも作られています。 •なので、ここでは、一旦ソリューションをリビルドします。
2.作成したPrism ModuleをWindowの方のプロジェクトで参照
3.Bootstrapperクラス•プロジェクトテンプレートでBootstrapper.csは、作成されているので、そちらに追記します。 • ConfigureModuleCatalog?で外部モジュールから呼び出すためのモジュール・カタログを作成します。
Bootstrapper.cs
using Microsoft.Practices.Unity; using Prism.Modularity; using Prism.Unity; using PrismUnityApp1.Views; using System.Windows;
namespace PrismUnityApp1 {
class Bootstrapper : UnityBootstrapper { protected override DependencyObject CreateShell() { return Container.Resolve<MainWindow>(); }
protected override void InitializeShell() { Application.Current.MainWindow.Show(); }
protected override void ConfigureModuleCatalog() { base.ConfigureModuleCatalog();
ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog; moduleCatalog.AddModule(typeof(PrismModule1.PrismModule1Module)); }
}
}
4.メインページの作成•Prismモジュールで作成したプロジェクトのViewsフォルダにUserControl?を作成します。WS000702.JPG •今回は、「MainView?」としています。
MainView?.xaml
UserControl? x:Class="PrismModule1.Views.MainView?"
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:PrismModule1.Views" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="50"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid Grid.Row="0" Background="Gray"> <TextBlock VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Text="「Prism Template Pack」サンプル" FontSize="20" Foreground="White" Margin="10"/> </Grid> <Grid Grid.Row="1" > <DataGrid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="10"></DataGrid> </Grid> </Grid>/UserControl?>
5.領域の作成•PrismModule1Module.csを開いて領域の作成を行います。 •ここでもPrism Moduleのプロジェクトテンプレートで作成した場合は、ある程度作成されているので、Initializeメソッドを修正します。
PrismModule1Module.cs
using Prism.Modularity; using Prism.Regions; using System;
namespace PrismModule1 { public class PrismModule1Module : IModule { IRegionManager _regionManager;
public PrismModule1Module(IRegionManager regionManager) { _regionManager = regionManager; }
public void Initialize() { //throw new NotImplementedException(); _regionManager.RegisterViewWithRegion("ContentRegion", typeof(Views.MainView)); } } }
6.リビルドして、実行•はい、これでMainView?がMainWindow?内に表示されることが確認できました。 •WS000704.JPG
まとめ プロジェクトテンプレートでちょこっとだけ手間が省けました。
とはいっても、いろいろと追記していかないといけないのですが、まず最初のディレクトリ構成を整えて、StartUp?消して、Bootstrapperクラスを作成して・・・
とかのめんどくささからは、少しだけ解放といったところでしょうか?
普段社内でWPFアプリケーションは、MEFを使っていて、Unityって触れたことがないので、今後は、これを使って何かやってみます。
ちなみに古い記事ですがこんなのがありました。 リンク:Unity vs. MEF
この記事は以下の記事からリンクされています [WPF][XAML]MahApps?.Metroのタイルコントロールを使ったメニュー画面を作ってみるからリンク10ヶ月前 [WPF][XAML]InkCanvas?を使ってみるからリンク8ヶ月前 [WPF][XAML]VB-ReportのWPF 用ビューアコントロールを使ってみるからリンク7ヶ月前 [WPF][XAML]InkCanvas?にTextBox?を追加してみるからリンク3ヶ月前