回答編集履歴
1
見直しキャンペーン中
answer
CHANGED
@@ -1,72 +1,72 @@
|
|
1
|
-
> どうやったら動的にロードしたViewをリージョンマネージャーでナビゲートできるかという質問でした。
|
2
|
-
|
3
|
-
モジュールについて調べていただけたのか甚だ疑問ですが、どうしても`CreateInstance`したいということでしょうか?
|
4
|
-
モジュールにはその辺の機能もありますしロード方法も選べるのですが。
|
5
|
-
|
6
|
-
何か事情があるとして(特別な事情は質問に書いてください)提示の方法でやってみます。
|
7
|
-
|
8
|
-
|
9
|
-
入っていると思いますが[Prism Template Pack](https://marketplace.visualstudio.com/items?itemName=BrianLagunas.PrismTemplatePack)の`Prism Full App(.NET Core)`で、新規にソリューションを作ります。
|
10
|
-
|
11
|
-
テストを含めてプロジェクト6つの、ゴツめのソリューションが生成されます。
|
12
|
-
すでにモジュールを使うようになっていますが、あえて使わないようにします。
|
13
|
-
|
14
|
-
1. `FullApp1`をスタートアッププロジェクトにして実行し、どのようなウィンドウが出るのか確認する
|
15
|
-
1. `FullApp1.Modules.ModuleName.ModuleNameModule`を削除なりコメント化する
|
16
|
-
1. `ModuleNameModule`の使用箇所、`FullApp1.App.ConfigureModuleCatalog`を削除なりコメント化する
|
17
|
-
1. 一度ソリューションをリビルドする
|
18
|
-
1. `FullApp1`プロジェクトから、`FullApp1.Modules.ModuleName`の参照を切る
|
19
|
-
1. `FullApp1.Modules.ModuleName.dll`を、出力ディレクトリを変えるなり手でコピーするなりで`FullApp1.exe`と同じフォルダに配置する
|
20
|
-
1. `FullApp1.App`を下記に書き換える
|
21
|
-
|
22
|
-
```
|
23
|
-
using FullApp1.Core;
|
24
|
-
using FullApp1.Services;
|
25
|
-
using FullApp1.Services.Interfaces;
|
26
|
-
using FullApp1.Views;
|
27
|
-
using Prism.Ioc;
|
28
|
-
using Prism.Regions;
|
29
|
-
using System.Reflection;
|
30
|
-
using System.Windows;
|
31
|
-
|
32
|
-
namespace FullApp1
|
33
|
-
{
|
34
|
-
public partial class App
|
35
|
-
{
|
36
|
-
protected override Window CreateShell()
|
37
|
-
{
|
38
|
-
return Container.Resolve<MainWindow>();
|
39
|
-
}
|
40
|
-
|
41
|
-
protected override void RegisterTypes(IContainerRegistry containerRegistry)
|
42
|
-
{
|
43
|
-
containerRegistry.RegisterSingleton<IMessageService, MessageService>();
|
44
|
-
|
45
|
-
var oAssembly = Assembly.LoadFrom(@".\FullApp1.Modules.ModuleName.dll");
|
46
|
-
var oClass = oAssembly.CreateInstance("FullApp1.Modules.ModuleName.Views.ViewA");
|
47
|
-
containerRegistry.RegisterInstance(oClass, "ViewA");
|
48
|
-
}
|
49
|
-
|
50
|
-
//protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
|
51
|
-
//{
|
52
|
-
// moduleCatalog.AddModule<ModuleNameModule>();
|
53
|
-
//}
|
54
|
-
|
55
|
-
protected override void OnInitialized()
|
56
|
-
{
|
57
|
-
base.OnInitialized();
|
58
|
-
|
59
|
-
var regionManager = Container.Resolve<IRegionManager>();
|
60
|
-
regionManager.RequestNavigate(RegionNames.ContentRegion, "ViewA");
|
61
|
-
}
|
62
|
-
}
|
63
|
-
}
|
64
|
-
```
|
65
|
-
|
66
|
-
では実行します。初めに実行したときと同じになったでしょうか?
|
67
|
-
|
68
|
-
`RequestNavigate`のタイミングが難しいというか、早すぎると出ないことはありました(よくわかっていません^^;
|
69
|
-
|
70
|
-
> VMの使いまわし方
|
71
|
-
|
1
|
+
> どうやったら動的にロードしたViewをリージョンマネージャーでナビゲートできるかという質問でした。
|
2
|
+
|
3
|
+
モジュールについて調べていただけたのか甚だ疑問ですが、どうしても`CreateInstance`したいということでしょうか?
|
4
|
+
モジュールにはその辺の機能もありますしロード方法も選べるのですが。
|
5
|
+
|
6
|
+
何か事情があるとして(特別な事情は質問に書いてください)提示の方法でやってみます。
|
7
|
+
Prismはコードが膨れがちでお互い説明や再現するのも大変なので、テンプレートをベースにします。
|
8
|
+
|
9
|
+
入っていると思いますが[Prism Template Pack](https://marketplace.visualstudio.com/items?itemName=BrianLagunas.PrismTemplatePack)の`Prism Full App(.NET Core)`で、新規にソリューションを作ります。
|
10
|
+
|
11
|
+
テストを含めてプロジェクト6つの、ゴツめのソリューションが生成されます。
|
12
|
+
すでにモジュールを使うようになっていますが、あえて使わないようにします。
|
13
|
+
|
14
|
+
1. `FullApp1`をスタートアッププロジェクトにして実行し、どのようなウィンドウが出るのか確認する
|
15
|
+
1. `FullApp1.Modules.ModuleName.ModuleNameModule`を削除なりコメント化する
|
16
|
+
1. `ModuleNameModule`の使用箇所、`FullApp1.App.ConfigureModuleCatalog`を削除なりコメント化する
|
17
|
+
1. 一度ソリューションをリビルドする
|
18
|
+
1. `FullApp1`プロジェクトから、`FullApp1.Modules.ModuleName`の参照を切る
|
19
|
+
1. `FullApp1.Modules.ModuleName.dll`を、出力ディレクトリを変えるなり手でコピーするなりで`FullApp1.exe`と同じフォルダに配置する
|
20
|
+
1. `FullApp1.App`を下記に書き換える
|
21
|
+
|
22
|
+
```cs
|
23
|
+
using FullApp1.Core;
|
24
|
+
using FullApp1.Services;
|
25
|
+
using FullApp1.Services.Interfaces;
|
26
|
+
using FullApp1.Views;
|
27
|
+
using Prism.Ioc;
|
28
|
+
using Prism.Regions;
|
29
|
+
using System.Reflection;
|
30
|
+
using System.Windows;
|
31
|
+
|
32
|
+
namespace FullApp1
|
33
|
+
{
|
34
|
+
public partial class App
|
35
|
+
{
|
36
|
+
protected override Window CreateShell()
|
37
|
+
{
|
38
|
+
return Container.Resolve<MainWindow>();
|
39
|
+
}
|
40
|
+
|
41
|
+
protected override void RegisterTypes(IContainerRegistry containerRegistry)
|
42
|
+
{
|
43
|
+
containerRegistry.RegisterSingleton<IMessageService, MessageService>();
|
44
|
+
|
45
|
+
var oAssembly = Assembly.LoadFrom(@".\FullApp1.Modules.ModuleName.dll");
|
46
|
+
var oClass = oAssembly.CreateInstance("FullApp1.Modules.ModuleName.Views.ViewA");
|
47
|
+
containerRegistry.RegisterInstance(oClass, "ViewA");
|
48
|
+
}
|
49
|
+
|
50
|
+
//protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
|
51
|
+
//{
|
52
|
+
// moduleCatalog.AddModule<ModuleNameModule>();
|
53
|
+
//}
|
54
|
+
|
55
|
+
protected override void OnInitialized()
|
56
|
+
{
|
57
|
+
base.OnInitialized();
|
58
|
+
|
59
|
+
var regionManager = Container.Resolve<IRegionManager>();
|
60
|
+
regionManager.RequestNavigate(RegionNames.ContentRegion, "ViewA");
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
```
|
65
|
+
|
66
|
+
では実行します。初めに実行したときと同じになったでしょうか?
|
67
|
+
|
68
|
+
`RequestNavigate`のタイミングが難しいというか、早すぎると出ないことはありました(よくわかっていません^^;
|
69
|
+
|
70
|
+
> VMの使いまわし方
|
71
|
+
|
72
72
|
それこそ`RegisterInstance`や`RegisterSingleton`等、好きに登録したらいいんじゃないですか?
|