回答編集履歴

1

見直しキャンペーン中

2023/07/22 10:06

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -1,207 +1,104 @@
1
1
  `ElementHost`に言及したので、簡単な例を回答します。
2
2
 
3
-
4
-
5
3
  [Calendar クラス (System.Windows.Controls) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.calendar)
6
-
7
4
 
8
-
9
5
  [ElementHost クラス (System.Windows.Forms.Integration) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.integration.elementhost)
10
-
11
6
  でホストします。
12
-
13
-
14
7
 
15
8
  > 既に登録されている日付を選択するとメッセージボックスが表示される
16
9
 
17
-
18
-
19
10
  そもそも選択不可なのとダイアログをポンポン出すのは趣味でないので、「選択しないと登録ボタンが押せない」というシナリオにしました。
20
11
 
21
-
22
-
23
12
  **注意**
24
-
25
13
  以下を「参照の追加」で入れる必要があります。
26
-
27
14
  PresentationCore
28
-
29
15
  PresentationFramework
30
-
31
16
  WindowsBase
32
-
33
17
  WindowsFormsIntegration
34
18
 
35
-
36
-
37
19
  日付選択後なぜかボタンを2回押す必要があります^^;
38
-
39
20
  正確にはカレンダー以外のフォームのどこかをクリックしてからでないとボタンが反応しない。
40
-
41
21
  解決法は探しきれませんでした。
42
22
 
43
-
44
-
45
- ```C#
23
+ ```cs
46
-
47
24
  using System;
48
-
49
25
  using System.Drawing;
50
-
51
26
  using System.Windows.Forms;
52
-
53
27
  using System.Windows.Forms.Integration;
54
28
 
55
-
56
-
57
29
  namespace Questions281450
58
-
59
30
  {
60
-
61
31
  public partial class Form1 : Form
62
-
63
32
  {
64
-
65
33
  private Button button1;
66
-
67
34
  private System.Windows.Controls.Calendar calendar1;
68
35
 
69
-
70
-
71
36
  public Form1()
72
-
73
37
  {
74
-
75
38
  InitializeComponent();
76
39
 
40
+ button1 = new Button
41
+ {
42
+ Text = "登録",
43
+ Enabled = false,
44
+ Location = new Point(200, 330),
45
+ };
46
+ button1.Click += (s, e) => MessageBox.Show($"{calendar1.SelectedDate?.ToString("yyyy/MM/dd")}を登録");
47
+ Controls.Add(button1);
77
48
 
78
-
49
+ // [WPF]カレンダーコントロール
79
- button1 = new Button
50
+ calendar1 = new System.Windows.Controls.Calendar
80
-
81
51
  {
82
-
83
- Text = "登録",
52
+ SelectedDate = null,
84
-
85
- Enabled = false,
53
+ IsTodayHighlighted = false,
86
-
54
+ //SelectionMode = System.Windows.Controls.CalendarSelectionMode.SingleDate,
55
+ //FirstDayOfWeek = DayOfWeek.Sunday,
87
- Location = new Point(200, 330),
56
+ // 背景色・枠色以外の色変更は可能だが簡単ではない^^;
57
+ //Background = System.Windows.Media.Brushes.LightPink,
58
+ //BorderBrush = System.Windows.Media.Brushes.Blue,
88
59
 
89
60
  };
61
+ calendar1.SelectedDatesChanged += (s, _) => button1.Enabled = calendar1.SelectedDate != null;
90
62
 
63
+ foreach(var d in getCSV())
64
+ {
65
+ // 選択不可日を追加
91
- button1.Click += (s, e) => MessageBox.Show($"{calendar1.SelectedDate?.ToString("yyyy/MM/dd")}を登録");
66
+ calendar1.BlackoutDates.Add(new System.Windows.Controls.CalendarDateRange(d));
67
+ }
68
+ // 過去を一括選択不可にする
69
+ //calendar1.BlackoutDates.AddDatesInPast();
92
70
 
93
- Controls.Add(button1);
94
-
95
-
96
-
97
- // [WPF]カレンダーコントロール
71
+ // [WPF]中身を拡大縮小するコントロール(フォーム側でサイズ調整しやすいように)
98
-
99
- calendar1 = new System.Windows.Controls.Calendar
72
+ var viewbox = new System.Windows.Controls.Viewbox
100
-
101
73
  {
102
-
103
- SelectedDate = null,
104
-
105
- IsTodayHighlighted = false,
106
-
107
- //SelectionMode = System.Windows.Controls.CalendarSelectionMode.SingleDate,
108
-
109
- //FirstDayOfWeek = DayOfWeek.Sunday,
110
-
111
- // 背景色・枠色以外の色変更は可能だが簡単ではない^^;
112
-
113
- //Background = System.Windows.Media.Brushes.LightPink,
114
-
115
- //BorderBrush = System.Windows.Media.Brushes.Blue,
74
+ Stretch = System.Windows.Media.Stretch.Fill,
116
-
75
+ Child = calendar1,
117
-
118
-
119
76
  };
120
77
 
121
- calendar1.SelectedDatesChanged += (s, _) => button1.Enabled = calendar1.SelectedDate != null;
78
+ // [WinForms]WPFコントロールをフォームに追加するコントロール
122
-
123
-
124
-
125
- foreach(var d in getCSV())
79
+ var elementHost1 = new ElementHost
126
-
127
80
  {
128
-
129
- // 選択不可日を追加
130
-
131
- calendar1.BlackoutDates.Add(new System.Windows.Controls.CalendarDateRange(d));
132
-
133
- }
134
-
135
- // 過去を一括選択不可にする
136
-
137
- //calendar1.BlackoutDates.AddDatesInPast();
138
-
139
-
140
-
141
- // [WPF]中身を拡大縮小するコントロール(フォーム側でサイズ調整しやすいように)
142
-
143
- var viewbox = new System.Windows.Controls.Viewbox
144
-
145
- {
146
-
147
- Stretch = System.Windows.Media.Stretch.Fill,
148
-
149
- Child = calendar1,
81
+ Child = viewbox,
150
-
82
+ Size = new Size(300, 300),
151
83
  };
152
-
153
-
154
-
155
- // [WinForms]WPFコントロールをフォームに追加するコントロール
156
-
157
- var elementHost1 = new ElementHost
158
-
159
- {
160
-
161
- Child = viewbox,
162
-
163
- Size = new Size(300, 300),
164
-
165
- };
166
-
167
84
  Controls.Add(elementHost1);
168
-
169
85
  }
170
86
 
171
-
172
-
173
87
  // CSVから取得したつもりで
174
-
175
88
  private DateTime[] getCSV()
176
-
177
89
  {
178
-
179
90
  var d = DateTime.Now.Date;
180
-
181
91
  return new DateTime[]
182
-
183
92
  {
184
-
185
93
  d.AddDays(-7),
186
-
187
94
  d.AddDays(-1),
188
-
189
95
  d.AddDays(1),
190
-
191
96
  d.AddDays(7),
192
-
193
97
  };
194
-
195
98
  }
196
-
197
99
  }
198
-
199
100
  }
200
-
201
101
  ```
202
102
 
203
103
 
204
-
205
-
206
-
207
104
  ![アプリ画像](d7143611c142438a1b1cd51c52079ed8.png)