回答編集履歴

1

見直しキャンペーン中

2023/07/27 13:55

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -1,143 +1,72 @@
1
1
  > どうやったら動的にロードしたViewをリージョンマネージャーでナビゲートできるかという質問でした。
2
2
 
3
-
4
-
5
3
  モジュールについて調べていただけたのか甚だ疑問ですが、どうしても`CreateInstance`したいということでしょうか?
6
-
7
4
  モジュールにはその辺の機能もありますしロード方法も選べるのですが。
8
5
 
9
-
10
-
11
6
  何か事情があるとして(特別な事情は質問に書いてください)提示の方法でやってみます。
12
-
13
- `Prism`はコードが膨れがちでお互い説明や再現するのも大変なので、テンプレートをベースにします。
7
+ Prismはコードが膨れがちでお互い説明や再現するのも大変なので、テンプレートをベースにします。
14
-
15
-
16
8
 
17
9
  入っていると思いますが[Prism Template Pack](https://marketplace.visualstudio.com/items?itemName=BrianLagunas.PrismTemplatePack)の`Prism Full App(.NET Core)`で、新規にソリューションを作ります。
18
10
 
19
-
20
-
21
11
  テストを含めてプロジェクト6つの、ゴツめのソリューションが生成されます。
22
-
23
12
  すでにモジュールを使うようになっていますが、あえて使わないようにします。
24
13
 
25
-
26
-
27
14
  1. `FullApp1`をスタートアッププロジェクトにして実行し、どのようなウィンドウが出るのか確認する
28
-
29
15
  1. `FullApp1.Modules.ModuleName.ModuleNameModule`を削除なりコメント化する
30
-
31
16
  1. `ModuleNameModule`の使用箇所、`FullApp1.App.ConfigureModuleCatalog`を削除なりコメント化する
32
-
33
17
  1. 一度ソリューションをリビルドする
34
-
35
18
  1. `FullApp1`プロジェクトから、`FullApp1.Modules.ModuleName`の参照を切る
36
-
37
19
  1. `FullApp1.Modules.ModuleName.dll`を、出力ディレクトリを変えるなり手でコピーするなりで`FullApp1.exe`と同じフォルダに配置する
38
-
39
20
  1. `FullApp1.App`を下記に書き換える
40
21
 
41
-
42
-
43
- ```C#
22
+ ```cs
44
-
45
23
  using FullApp1.Core;
46
-
47
24
  using FullApp1.Services;
48
-
49
25
  using FullApp1.Services.Interfaces;
50
-
51
26
  using FullApp1.Views;
52
-
53
27
  using Prism.Ioc;
54
-
55
28
  using Prism.Regions;
56
-
57
29
  using System.Reflection;
58
-
59
30
  using System.Windows;
60
31
 
61
-
62
-
63
32
  namespace FullApp1
64
-
65
33
  {
66
-
67
34
  public partial class App
68
-
69
35
  {
70
-
71
36
  protected override Window CreateShell()
72
-
73
37
  {
74
-
75
38
  return Container.Resolve<MainWindow>();
76
-
77
39
  }
78
40
 
79
-
80
-
81
41
  protected override void RegisterTypes(IContainerRegistry containerRegistry)
82
-
83
42
  {
84
-
85
43
  containerRegistry.RegisterSingleton<IMessageService, MessageService>();
86
44
 
87
-
88
-
89
45
  var oAssembly = Assembly.LoadFrom(@".\FullApp1.Modules.ModuleName.dll");
90
-
91
46
  var oClass = oAssembly.CreateInstance("FullApp1.Modules.ModuleName.Views.ViewA");
92
-
93
47
  containerRegistry.RegisterInstance(oClass, "ViewA");
94
-
95
48
  }
96
49
 
97
-
98
-
99
50
  //protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
100
-
101
51
  //{
102
-
103
52
  // moduleCatalog.AddModule<ModuleNameModule>();
104
-
105
53
  //}
106
54
 
107
-
108
-
109
55
  protected override void OnInitialized()
110
-
111
56
  {
112
-
113
57
  base.OnInitialized();
114
58
 
115
-
116
-
117
59
  var regionManager = Container.Resolve<IRegionManager>();
118
-
119
60
  regionManager.RequestNavigate(RegionNames.ContentRegion, "ViewA");
120
-
121
61
  }
122
-
123
62
  }
124
-
125
63
  }
126
-
127
64
  ```
128
-
129
-
130
65
 
131
66
  では実行します。初めに実行したときと同じになったでしょうか?
132
67
 
133
-
134
-
135
68
  `RequestNavigate`のタイミングが難しいというか、早すぎると出ないことはありました(よくわかっていません^^;
136
-
137
-
138
69
 
139
70
  > VMの使いまわし方
140
71
 
141
-
142
-
143
72
  それこそ`RegisterInstance`や`RegisterSingleton`等、好きに登録したらいいんじゃないですか?