回答編集履歴

1

見直しキャンペーン中

2023/07/26 13:57

投稿

TN8001
TN8001

スコア9326

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
- ```xaml
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
- ```VB
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/)