回答編集履歴

2

見直しキャンペーン中

2023/07/21 11:05

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,9 +1,9 @@
1
1
  退会されてしまったようですが。。。
2
2
  せっかく準備したので他の方にも役立つよう回答しておきます。
3
3
 
4
- まず`ViewModel`ですが、`WPF`において必須ではありません。
4
+ まず`ViewModel`ですが、WPFにおいて必須ではありません。
5
5
  なくても作れます。回答では使いませんでした。
6
- しかし使わないと`WPF`の魅力が8割減なので、ぜひ`WPF MVVM`等で調べてみてください。
6
+ しかし使わないとWPFの魅力が8割減なので、ぜひ「[wpf mvvm](https://www.google.co.jp/search?q=wpf+mvvm)」等で調べてみてください。
7
7
  その際に記事中で使用されている`ReactiveProperty`も出てくると思います。
8
8
 
9
9
  ---

1

見直しキャンペーン中

2023/07/21 11:03

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,279 +1,139 @@
1
1
  退会されてしまったようですが。。。
2
-
3
2
  せっかく準備したので他の方にも役立つよう回答しておきます。
4
3
 
5
-
6
-
7
4
  まず`ViewModel`ですが、`WPF`において必須ではありません。
8
-
9
5
  なくても作れます。回答では使いませんでした。
10
-
11
6
  しかし使わないと`WPF`の魅力が8割減なので、ぜひ`WPF MVVM`等で調べてみてください。
12
-
13
7
  その際に記事中で使用されている`ReactiveProperty`も出てくると思います。
14
-
15
-
16
8
 
17
9
  ---
18
10
 
19
-
20
-
21
11
  何度も使うということですと`MainWindow`内に用意して、ビジー中だけすべてのコントロールの上に覆いかぶさるような作りがいいと思います。
22
-
23
12
  回転し続ける`C`を描いておいて、必要に応じて`Visibility`で制御します。
24
13
 
25
-
26
-
27
- MainWindow.xaml
14
+ ```xml:MainWindow.xaml
28
-
29
- ```xaml
30
-
31
15
  <Window
32
-
33
16
  x:Class="Questions256032.MainWindow"
34
-
35
17
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
36
-
37
18
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
38
-
39
19
  Width="800"
40
-
41
20
  Height="450">
42
-
43
21
  <Grid>
44
22
 
45
-
46
-
47
23
  <!-- ここに通常のUI要素 -->
48
-
49
24
  <Grid>
50
-
51
25
  <Grid.RowDefinitions>
52
-
53
26
  <RowDefinition Height="Auto" />
54
-
55
27
  <RowDefinition Height="Auto" />
56
-
57
28
  <RowDefinition />
58
-
59
29
  </Grid.RowDefinitions>
60
-
61
30
  <TextBlock
62
-
63
31
  x:Name="textBlock"
64
-
65
32
  Margin="10"
66
-
67
33
  Text="ほにゃらら" />
68
-
69
34
  <TextBox
70
-
71
35
  Grid.Row="1"
72
-
73
36
  Margin="10"
74
-
75
37
  Text="なんだかんだ" />
76
-
77
38
  <Button
78
-
79
39
  Grid.Row="2"
80
-
81
40
  HorizontalAlignment="Center"
82
-
83
41
  VerticalAlignment="Center"
84
-
85
42
  Click="Button_Click"
86
-
87
43
  Content="なんか重い処理を始めます" />
88
-
89
-
90
44
 
91
45
  </Grid>
92
46
 
93
47
 
94
-
95
-
96
-
97
48
  <!-- これが上にかぶさるビジーインジケーター -->
98
-
99
49
  <Grid x:Name="busy" Visibility="Hidden">
100
50
 
101
-
102
-
103
51
  <!-- ビジー中はボタン等をいじれないように半透明のGridを表示 -->
104
-
105
52
  <Grid Background="Black" Opacity="0.2" />
106
-
107
53
  <!--<Image Source="hoge.png" />-->
108
54
 
109
-
110
-
111
55
  <!-- Cの字 -->
112
-
113
56
  <!-- 大きさを変える場合以下の50を全部変える -->
114
-
115
57
  <Path
116
-
117
58
  HorizontalAlignment="Center"
118
-
119
59
  VerticalAlignment="Center"
120
-
121
60
  Stroke="Blue"
122
-
123
61
  StrokeThickness="10">
124
-
125
62
  <Path.Data>
126
-
127
63
  <PathGeometry>
128
-
129
64
  <PathGeometry.Figures>
130
-
131
65
  <PathFigure StartPoint="50,0">
132
-
133
66
  <ArcSegment
134
-
135
67
  IsLargeArc="True"
136
-
137
68
  Point="0,50"
138
-
139
69
  Size="50,50"
140
-
141
70
  SweepDirection="Clockwise" />
142
-
143
71
  </PathFigure>
144
-
145
72
  </PathGeometry.Figures>
146
-
147
73
  </PathGeometry>
148
-
149
74
  </Path.Data>
150
-
151
75
  <Path.RenderTransform>
152
-
153
76
  <RotateTransform CenterX="50" CenterY="50" />
154
-
155
77
  </Path.RenderTransform>
156
-
157
78
  <Path.Triggers>
158
-
159
79
  <EventTrigger RoutedEvent="Loaded">
160
-
161
80
  <BeginStoryboard>
162
-
163
81
  <Storyboard>
164
-
165
82
  <!-- 回り続けるアニメーション Duration でスピードの変更 -->
166
-
167
83
  <DoubleAnimation
168
-
169
84
  RepeatBehavior="Forever"
170
-
171
85
  Storyboard.TargetProperty="RenderTransform.(RotateTransform.Angle)"
172
-
173
86
  To="360"
174
-
175
87
  Duration="0:0:1.5" />
176
-
177
88
  </Storyboard>
178
-
179
89
  </BeginStoryboard>
180
-
181
90
  </EventTrigger>
182
-
183
91
  </Path.Triggers>
184
-
185
92
  </Path>
186
-
187
93
  </Grid>
188
-
189
94
  </Grid>
190
-
191
95
  </Window>
192
-
193
96
  ```
194
97
 
195
-
196
-
197
- MainWindow.xaml.cs
98
+ ```cs:MainWindow.xaml.cs
198
-
199
- ```C#
200
-
201
99
  using System.Threading;
202
-
203
100
  using System.Threading.Tasks;
204
-
205
101
  using System.Windows;
206
102
 
207
-
208
-
209
103
  namespace Questions256032
210
-
211
104
  {
212
-
213
105
  public partial class MainWindow : Window
214
-
215
106
  {
216
-
217
107
  public MainWindow()
218
-
219
108
  {
220
-
221
109
  InitializeComponent();
222
-
223
110
  }
224
111
 
225
-
226
-
227
112
  private async void Button_Click(object sender, RoutedEventArgs e)
228
-
229
113
  {
230
-
231
114
  textBlock.Text = "重たい処理を始めるよ";
232
-
233
115
  busy.Visibility = Visibility.Visible;
234
-
235
-
236
116
 
237
117
  await Task.Run(() => HeavyWork());
238
118
 
239
-
240
-
241
119
  busy.Visibility = Visibility.Hidden;
242
-
243
120
  textBlock.Text = "終わったよ";
244
-
245
121
  }
246
122
 
247
-
248
-
249
123
  // なんか重たい処理をする
250
-
251
124
  private void HeavyWork()
252
-
253
125
  {
254
-
255
126
  Thread.Sleep(5000);
256
127
 
257
-
258
-
259
128
  // NG ここでは普通にはUI要素に触れない
260
-
261
129
  //textBlock.Text = "あとちょっと";
262
130
 
263
-
264
-
265
131
  // OK
266
-
267
132
  Dispatcher.Invoke(() => textBlock.Text = "あとちょっと");
268
133
 
269
-
270
-
271
134
  Thread.Sleep(3000);
272
-
273
135
  }
274
-
275
136
  }
276
-
277
137
  }
278
-
279
138
  ```
139
+ ![アプリ動画](https://ddjkaamml8q8x.cloudfront.net/questions/2023-07-21/304d1d27-06ae-407e-a211-ab5b0003c9ac.gif)