回答編集履歴

1

回答になっていなかったのでサンプルを記述した。

2016/11/24 23:00

投稿

Hey_CH
Hey_CH

スコア437

test CHANGED
@@ -1,3 +1,91 @@
1
1
  http://www.atmarkit.co.jp/ait/articles/1511/04/news027.html
2
2
 
3
3
  こちらを参考にスプラッシュウィンドウをまず表示して、MainWindow表示に必要な処理を非同期で実行、その処理が完了したら後MainWindowを表示してやれば良いのではないでしょうか?
4
+
5
+
6
+
7
+ 追記
8
+
9
+ すいません、表示中の処理でしたね。
10
+
11
+ 処理を考えないといけないようであればスプラッシュウィンドウは不要だと思いますよ。
12
+
13
+ たとえば、ViewModelの初期化に時間がかかる等で表示するのがスプラッシュウィンドウだと思うので。
14
+
15
+
16
+
17
+ サンプルで書いたコードは以下のような感じです
18
+
19
+ ```C#
20
+
21
+ public partial class App : Application {
22
+
23
+ [STAThread]
24
+
25
+ public static void Main() {
26
+
27
+ Common.VM = new ViewModel();
28
+
29
+ var sw = new SplashWindow();
30
+
31
+ sw.DataContext = Common.VM;
32
+
33
+ sw.ContentRendered += (s, e) => {
34
+
35
+ new Action(async () => {
36
+
37
+ await Common.VM.Load();
38
+
39
+ sw.Close();
40
+
41
+ }).Invoke();
42
+
43
+ };
44
+
45
+ sw.ShowDialog();
46
+
47
+
48
+
49
+
50
+
51
+ App app = new App();
52
+
53
+ app.InitializeComponent();
54
+
55
+ app.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
56
+
57
+ app.Run();
58
+
59
+ }
60
+
61
+ public class ViewModel : INotifyPropertyChanged {
62
+
63
+ public async Task Load() {
64
+
65
+ await Task.Run(() => {
66
+
67
+ Status = "読み込み1を開始します。";
68
+
69
+ System.Threading.Thread.Sleep(2000);
70
+
71
+ Status = "読み込み2を開始します。";
72
+
73
+ System.Threading.Thread.Sleep(5000);
74
+
75
+ Status = "完了しました。";
76
+
77
+ });
78
+
79
+ }
80
+
81
+
82
+
83
+ }
84
+
85
+ public class Common {
86
+
87
+ public static ViewModel VM { get; set; }
88
+
89
+ }
90
+
91
+ ```