質問編集履歴

3

追記しました

2023/06/20 05:00

投稿

nodoita
nodoita

スコア7

test CHANGED
File without changes
test CHANGED
@@ -179,7 +179,6 @@
179
179
  ```
180
180
 
181
181
  ```xaml.cs
182
- public ObservableCollection<MyRect> MyRects = new ObservableCollection<MyRect>();
183
182
 
184
183
  public MainWindow()
185
184
  {
@@ -226,7 +225,6 @@
226
225
  MyCanvas.Children.Remove(rectangle);
227
226
  MyRects.Add(new RectangleItem { X = R_X, Y = R_Y, Width =R_W, Height =R_H, Fill = Brushes.Transparent, Stroke=Brushes.Red});
228
227
 
229
- // MyRects.Add(new MyRect(R_X,R_Y,R_H,R_W, Brushes.Red, Brushes.Transparent));
230
228
 
231
229
  isMouseDown = false;
232
230
  rectangle.Opacity = 1;
@@ -254,6 +252,23 @@
254
252
  </ItemsControl>
255
253
  </Grid>
256
254
  ```
255
+ ```MyRect.cs
256
+ public class MyRect
257
+ {
258
+ public double X { get; set; }
259
+ public double Y { get; set; }
260
+ public double Width { get; set; }
261
+ public double Height { get; set; }
262
+
263
+ }
264
+
265
+ public class RectangleItem : MyRect
266
+ {
267
+ public Brush Stroke { get; set; } = Brushes.Red;
268
+ public Brush Fill { get; set; } = Brushes.Transparent;
269
+ }
270
+ ```
271
+
257
272
  MyCanvas.Children.Remove(rectangle);で
258
273
  描画していた四角形を消すところまでは出来ましたが、
259
274
  Rectangleが動的生成されません。なぜでしょう……?
@@ -263,6 +278,10 @@
263
278
   Rectangleが自動生成されない
264
279
   →やはりViewModel.csに追加していないから?
265
280
 
281
+ ((ViewModel)DataContext).MyRects.Add(new RectangleItem { X = 100, Y = 50, Width = 50, Height = 50 });
282
+ LeftButtonup時に上記内容を追加するようにしたら
283
+ MyRectsに値は追加されましたが四角形は表示されませんでした。
284
+
266
285
 
267
286
 
268
287
  ### 補足情報(FW/ツールのバージョンなど)

2

一部間違えていたので修正

2023/06/20 01:44

投稿

nodoita
nodoita

スコア7

test CHANGED
File without changes
test CHANGED
@@ -157,31 +157,79 @@
157
157
  (移動や拡縮は、おいおいやります)
158
158
 
159
159
  とりあえず勉強の為、別で1つ作りました。
160
+
160
- ```xaml.cs
161
+ ```Rect.cs
161
- public ObservableCollection<Item> Items { get; }
162
-
163
- public class Item
162
+ public class MyRect
164
163
  {
165
164
  public double X { get; set; }
166
165
  public double Y { get; set; }
167
166
  public double Width { get; set; }
168
167
  public double Height { get; set; }
168
+
169
- }
169
+ }
170
-
170
+
171
- public class RectangleItem : Item
171
+ public class RectangleItem : MyRect
172
- {
172
+ {
173
+ public Brush Stroke { get; set; }
173
174
  public Brush Fill { get; set; }
174
175
  }
175
176
 
177
+
178
+ }
179
+ ```
180
+
181
+ ```xaml.cs
182
+ public ObservableCollection<MyRect> MyRects = new ObservableCollection<MyRect>();
183
+
176
184
  public MainWindow()
177
185
  {
178
186
  InitializeComponent();
179
- DataContext = this;
187
+ var imageFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "image");
180
-
181
- Items = new ObservableCollection<Item>
188
+ DataContext = new ViewModel(imageFolder);
189
+ }
190
+
191
+ private void MyCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
182
- {
192
+ {
193
+ var point = e.GetPosition(MyCanvas);
194
+
195
+ var leftOffset = point.X % 10;
183
- new RectangleItem { X = 200, Y = 200, Width = 100, Height = 50, Fill = Brushes.Blue, },
196
+ leftOffset = leftOffset < 5 ? -leftOffset : 10 - leftOffset;
197
+ var topOffset = point.Y % 10;
198
+ topOffset = topOffset < 5 ? -topOffset : 10 - topOffset;
199
+
200
+ StartPoint = new Point(point.X + leftOffset, point.Y + topOffset);
201
+
202
+ rectangle = new Rectangle
203
+ {
204
+ Stroke = Brushes.Black,
205
+ Fill = Brushes.LightBlue,
206
+ HorizontalAlignment = HorizontalAlignment.Left,
207
+ VerticalAlignment = VerticalAlignment.Top,
208
+ Width = 0,
209
+ Height = 0,
210
+ Opacity = 0.3
184
211
  };
212
+
213
+ Canvas.SetLeft(rectangle, StartPoint.X);
214
+ Canvas.SetTop(rectangle, StartPoint.Y);
215
+ MyCanvas.Children.Add(rectangle);
216
+
217
+ isMouseDown = true;
218
+ }
219
+
220
+ private void MyCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
221
+ {
222
+ var R_X = MovePoint.X;
223
+ var R_Y = MovePoint.Y;
224
+ var R_H=rectangle.ActualHeight;
225
+ var R_W=rectangle.ActualWidth;
226
+ MyCanvas.Children.Remove(rectangle);
227
+ MyRects.Add(new RectangleItem { X = R_X, Y = R_Y, Width =R_W, Height =R_H, Fill = Brushes.Transparent, Stroke=Brushes.Red});
228
+
229
+ // MyRects.Add(new MyRect(R_X,R_Y,R_H,R_W, Brushes.Red, Brushes.Transparent));
230
+
231
+ isMouseDown = false;
232
+ rectangle.Opacity = 1;
185
233
  }
186
234
  ```
187
235
  ```MainWindow.xaml
@@ -213,6 +261,7 @@
213
261
  ①ViewModel.csにRectsを追加しなければならないのか?
214
262
  ②MyRectsの値を見るとちゃんと値は入っているものの
215
263
   Rectangleが自動生成されない
264
+  →やはりViewModel.csに追加していないから?
216
265
 
217
266
 
218
267
 

1

現在試していることを追記

2023/06/20 01:41

投稿

nodoita
nodoita

スコア7

test CHANGED
File without changes
test CHANGED
@@ -148,29 +148,72 @@
148
148
  }
149
149
  ```
150
150
 
151
- ### 試したこと
151
+ ### 試したこと(6/20 9:30修正)
152
-
152
+ Canvasコントロールの子要素を動的に増減させたい
153
-
153
+ https://teratail.com/questions/359699
154
+
155
+ とりあえず、Rectangleの値を動的に生成したり、
156
+ 選択したRectangleのサイズ等を取得したいです。
157
+ (移動や拡縮は、おいおいやります)
158
+
159
+ とりあえず勉強の為、別で1つ作りました。
160
+ ```xaml.cs
161
+ public ObservableCollection<Item> Items { get; }
162
+
163
+ public class Item
164
+ {
165
+ public double X { get; set; }
166
+ public double Y { get; set; }
167
+ public double Width { get; set; }
168
+ public double Height { get; set; }
169
+ }
170
+
171
+ public class RectangleItem : Item
172
+ {
173
+ public Brush Fill { get; set; }
174
+ }
175
+
176
+ public MainWindow()
177
+ {
178
+ InitializeComponent();
179
+ DataContext = this;
180
+
181
+ Items = new ObservableCollection<Item>
182
+ {
183
+ new RectangleItem { X = 200, Y = 200, Width = 100, Height = 50, Fill = Brushes.Blue, },
184
+ };
185
+ }
186
+ ```
154
- MainWindow.xaml.csファイルに
187
+ ```MainWindow.xaml
155
- 以下内容を追記しました。
188
+ <Window.Resources>
156
- public ObservableCollection<MyRect> MyRects = new ObservableCollection<MyRect>();
189
+ <DataTemplate DataType="{x:Type local:RectangleItem}">
190
+ <Rectangle Width="{Binding Width}" Height="{Binding Height}" Fill="{Binding Fill}" Stroke="{Binding Stroke}" />
191
+ </DataTemplate>
192
+ </Window.Resources>
193
+ <Grid>
157
- MyRects.Add(new MyRect(R_X,R_Y,R_H,R_W, Brushes.Red, Brushes.Transparent));//追加した
194
+ <ItemsControl ItemsSource="{Binding MyRects}">
158
-
195
+ <ItemsControl.ItemsPanel>
159
- rectangleに今作成中の四角形データがあると思うので
196
+ <ItemsPanelTemplate>
160
- とりあえずMyRectsに入れることにしました。
161
- 色の値とかも含めて入れてみました。
162
- var R_X = MovePoint.X;
197
+ <Canvas />
163
- var R_Y = MovePoint.Y;
164
- var R_H = rectangle.ActualHeight;
198
+ </ItemsPanelTemplate>
165
- var R_W = rectangle.ActualWidth;
199
+ </ItemsControl.ItemsPanel>
200
+ <ItemsControl.ItemContainerStyle>
201
+ <Style>
202
+ <Setter Property="Canvas.Left" Value="{Binding X}" />
166
- MyRects.Add(new MyRect(R_X,R_Y,R_H,R_W, Brushes.Red, Brushes.Transparent));
203
+ <Setter Property="Canvas.Top" Value="{Binding Y}" />
204
+ </Style>
205
+ </ItemsControl.ItemContainerStyle>
206
+ </ItemsControl>
207
+ </Grid>
208
+ ```
167
- MyCanvas.Children.Add(MyRects[MyRects.Count-1]);としてみましたが
209
+ MyCanvas.Children.Remove(rectangle);
168
-  
210
+ 描画していた四角形を消すところまでは出来ましたが、
169
-  そもそもRectangleを作していないからか上手くいきません。
211
+ Rectangleが動的生されません。なぜでしょう……?
212
+
213
+ ①ViewModel.csにRectsを追加しなければならないのか?
214
+ ②MyRectsの値を見るとちゃんと値は入っているものの
170
-  元々利用しているrectangleの値を保持し、
215
+  Rectangleが自動生成されない
171
-  それを再利用すれば良いのだと思いますが、どのように修正したら良いのか分かりません。
216
+
172
-
173
-  初歩的な質問で大変申し訳ありませんが、回答よろしくお願いいたします。
174
217
 
175
218
 
176
219
  ### 補足情報(FW/ツールのバージョンなど)