回答編集履歴
1
見直しキャンペーン中
test
CHANGED
@@ -1,203 +1,102 @@
|
|
1
1
|
基本的には重い処理を`Task.Run()`に包むだけです。
|
2
|
-
|
3
|
-
|
4
2
|
|
5
3
|
> 「UI以外にセットさせると例外が発生する」
|
6
4
|
|
7
|
-
|
8
|
-
|
9
5
|
UIスレッド以外からいじれないのはコントロール類です(`textBlock.Text=""`のような)
|
10
|
-
|
11
6
|
バインディングに使用しているプロパティは、スレッドに関係なく変更できます。
|
12
7
|
|
13
|
-
|
14
|
-
|
15
|
-
```x
|
8
|
+
```xml
|
16
|
-
|
17
9
|
<Window
|
18
|
-
|
19
10
|
x:Class="MainWindow"
|
20
|
-
|
21
11
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
22
|
-
|
23
12
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
24
|
-
|
25
13
|
xmlns:local="clr-namespace:Questions321254"
|
26
|
-
|
27
14
|
Width="800"
|
28
|
-
|
29
15
|
Height="450">
|
30
|
-
|
31
16
|
<Window.DataContext>
|
32
|
-
|
33
17
|
<local:ViewModel />
|
34
|
-
|
35
18
|
</Window.DataContext>
|
36
|
-
|
37
19
|
<DockPanel>
|
38
|
-
|
39
20
|
<Menu DockPanel.Dock="Top">
|
40
|
-
|
41
21
|
<MenuItem Command="{Binding MyCommand}" Header="MyCommand" />
|
42
|
-
|
43
22
|
<MenuItem Command="{Binding MyCommand2}" Header="MyCommand2" />
|
44
|
-
|
45
23
|
<MenuItem Command="{Binding AsyncReactiveCommand}" Header="AsyncReactiveCommand" />
|
46
|
-
|
47
24
|
</Menu>
|
48
|
-
|
49
25
|
<TextBlock Text="{Binding Output}" />
|
50
|
-
|
51
26
|
</DockPanel>
|
52
|
-
|
53
27
|
</Window>
|
54
|
-
|
55
28
|
```
|
56
29
|
|
57
|
-
|
58
|
-
|
59
|
-
```
|
30
|
+
```vb
|
60
|
-
|
61
31
|
Imports System.Threading
|
62
|
-
|
63
32
|
Imports Prism.Commands
|
64
|
-
|
65
33
|
Imports Prism.Mvvm
|
66
|
-
|
67
34
|
Imports Reactive.Bindings
|
68
35
|
|
69
|
-
|
70
|
-
|
71
36
|
Public Class ViewModel
|
72
|
-
|
73
37
|
Inherits BindableBase
|
74
38
|
|
75
|
-
|
76
|
-
|
77
39
|
Private _Output As String
|
78
|
-
|
79
40
|
Public Property Output As String
|
80
|
-
|
81
41
|
Get
|
82
|
-
|
83
42
|
Return _Output
|
84
|
-
|
85
43
|
End Get
|
86
|
-
|
87
44
|
Set(ByVal value As String)
|
88
|
-
|
89
45
|
SetProperty(_Output, value)
|
90
|
-
|
91
46
|
End Set
|
92
|
-
|
93
47
|
End Property
|
94
48
|
|
95
|
-
|
96
|
-
|
97
49
|
'MyCommand2で実行可否に使用
|
98
|
-
|
99
50
|
Private _CanExecute As Boolean = True
|
100
|
-
|
101
51
|
Private Property CanExecute As Boolean
|
102
|
-
|
103
52
|
Get
|
104
|
-
|
105
53
|
Return _CanExecute
|
106
|
-
|
107
54
|
End Get
|
108
|
-
|
109
55
|
Set(ByVal value As Boolean)
|
110
|
-
|
111
56
|
SetProperty(_CanExecute, value)
|
112
|
-
|
113
57
|
End Set
|
114
|
-
|
115
58
|
End Property
|
116
59
|
|
117
|
-
|
118
|
-
|
119
60
|
Public ReadOnly Property MyCommand As DelegateCommand
|
120
|
-
|
121
61
|
Public ReadOnly Property MyCommand2 As DelegateCommand
|
122
|
-
|
123
62
|
Public ReadOnly Property AsyncReactiveCommand As AsyncReactiveCommand
|
124
63
|
|
125
|
-
|
126
|
-
|
127
64
|
Public Sub New()
|
128
|
-
|
129
65
|
MyCommand = New DelegateCommand(AddressOf MyCommandExecute)
|
130
|
-
|
131
66
|
MyCommand2 = New DelegateCommand(Async Sub() Await MyCommand2Execute()).ObservesCanExecute(Function() CanExecute)
|
132
|
-
|
133
67
|
AsyncReactiveCommand = New AsyncReactiveCommand().WithSubscribe(AddressOf AsyncReactiveCommandExecute)
|
134
|
-
|
135
68
|
End Sub
|
136
69
|
|
137
|
-
|
138
|
-
|
139
70
|
'何の制御もないので連打できてしまう
|
140
|
-
|
141
71
|
Private Sub MyCommandExecute()
|
142
|
-
|
143
72
|
Task.Run(Sub() HeavyWork()) '投げっぱなしTask
|
144
|
-
|
145
73
|
End Sub
|
146
74
|
|
147
|
-
|
148
|
-
|
149
75
|
'処理中は押せないようにCanExecuteプロパティで制御
|
150
|
-
|
151
76
|
Private Async Function MyCommand2Execute() As Task
|
152
|
-
|
153
77
|
CanExecute = False
|
154
|
-
|
155
78
|
Await Task.Run(Sub() HeavyWork())
|
156
|
-
|
157
79
|
CanExecute = True
|
158
|
-
|
159
80
|
End Function
|
160
81
|
|
161
|
-
|
162
|
-
|
163
82
|
'AsyncReactiveCommandならおまかせできる
|
164
|
-
|
165
83
|
Private Async Function AsyncReactiveCommandExecute() As Task
|
166
|
-
|
167
84
|
Await Task.Run(Sub() HeavyWork())
|
168
|
-
|
169
85
|
End Function
|
170
86
|
|
171
|
-
|
172
|
-
|
173
87
|
Private Sub HeavyWork()
|
174
|
-
|
175
88
|
Output += "はじめるよ" & vbLf
|
176
|
-
|
177
89
|
Thread.Sleep(1000)
|
178
|
-
|
179
90
|
Output += "もうちょっと" & vbLf
|
180
|
-
|
181
91
|
Thread.Sleep(1000)
|
182
|
-
|
183
92
|
Output += "おわったよ" & vbLf
|
184
|
-
|
185
93
|
End Sub
|
186
|
-
|
187
94
|
End Class
|
188
|
-
|
189
95
|
```
|
190
|
-
|
191
96
|
VBは全然わかっていないので、変な書き方をしていたらすいません。
|
192
97
|
|
193
|
-
|
194
|
-
|
195
98
|
`DelegateCommand`実装は↓を使用しました。
|
196
|
-
|
197
99
|
[NuGet Gallery | Prism.Core 8.0.0.1909](https://www.nuget.org/packages/Prism.Core/)
|
198
100
|
|
199
|
-
|
200
|
-
|
201
101
|
おまかせ例の`AsyncReactiveCommand`は↓に含まれています。
|
202
|
-
|
203
102
|
[NuGet Gallery | ReactiveProperty 7.7.0](https://www.nuget.org/packages/ReactiveProperty/)
|