teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

見直しキャンペーン中

2023/07/22 10:06

投稿

TN8001
TN8001

スコア10108

answer CHANGED
@@ -1,104 +1,104 @@
1
- `ElementHost`に言及したので、簡単な例を回答します。
2
-
3
- [Calendar クラス (System.Windows.Controls) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.calendar)
4
-
5
- [ElementHost クラス (System.Windows.Forms.Integration) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.integration.elementhost)
6
- でホストします。
7
-
8
- > 既に登録されている日付を選択するとメッセージボックスが表示される
9
-
10
- そもそも選択不可なのとダイアログをポンポン出すのは趣味でないので、「選択しないと登録ボタンが押せない」というシナリオにしました。
11
-
12
- **注意**
13
- 以下を「参照の追加」で入れる必要があります。
14
- PresentationCore
15
- PresentationFramework
16
- WindowsBase
17
- WindowsFormsIntegration
18
-
19
- 日付選択後なぜかボタンを2回押す必要があります^^;
20
- 正確にはカレンダー以外のフォームのどこかをクリックしてからでないとボタンが反応しない。
21
- 解決法は探しきれませんでした。
22
-
23
- ```C#
24
- using System;
25
- using System.Drawing;
26
- using System.Windows.Forms;
27
- using System.Windows.Forms.Integration;
28
-
29
- namespace Questions281450
30
- {
31
- public partial class Form1 : Form
32
- {
33
- private Button button1;
34
- private System.Windows.Controls.Calendar calendar1;
35
-
36
- public Form1()
37
- {
38
- InitializeComponent();
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);
48
-
49
- // [WPF]カレンダーコントロール
50
- calendar1 = new System.Windows.Controls.Calendar
51
- {
52
- SelectedDate = null,
53
- IsTodayHighlighted = false,
54
- //SelectionMode = System.Windows.Controls.CalendarSelectionMode.SingleDate,
55
- //FirstDayOfWeek = DayOfWeek.Sunday,
56
- // 背景色・枠色以外の色変更は可能だが簡単ではない^^;
57
- //Background = System.Windows.Media.Brushes.LightPink,
58
- //BorderBrush = System.Windows.Media.Brushes.Blue,
59
-
60
- };
61
- calendar1.SelectedDatesChanged += (s, _) => button1.Enabled = calendar1.SelectedDate != null;
62
-
63
- foreach(var d in getCSV())
64
- {
65
- // 選択不可日を追加
66
- calendar1.BlackoutDates.Add(new System.Windows.Controls.CalendarDateRange(d));
67
- }
68
- // 過去を一括選択不可にする
69
- //calendar1.BlackoutDates.AddDatesInPast();
70
-
71
- // [WPF]中身を拡大縮小するコントロール(フォーム側でサイズ調整しやすいように)
72
- var viewbox = new System.Windows.Controls.Viewbox
73
- {
74
- Stretch = System.Windows.Media.Stretch.Fill,
75
- Child = calendar1,
76
- };
77
-
78
- // [WinForms]WPFコントロールをフォームに追加するコントロール
79
- var elementHost1 = new ElementHost
80
- {
81
- Child = viewbox,
82
- Size = new Size(300, 300),
83
- };
84
- Controls.Add(elementHost1);
85
- }
86
-
87
- // CSVから取得したつもりで
88
- private DateTime[] getCSV()
89
- {
90
- var d = DateTime.Now.Date;
91
- return new DateTime[]
92
- {
93
- d.AddDays(-7),
94
- d.AddDays(-1),
95
- d.AddDays(1),
96
- d.AddDays(7),
97
- };
98
- }
99
- }
100
- }
101
- ```
102
-
103
-
1
+ `ElementHost`に言及したので、簡単な例を回答します。
2
+
3
+ [Calendar クラス (System.Windows.Controls) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.calendar)
4
+
5
+ [ElementHost クラス (System.Windows.Forms.Integration) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.integration.elementhost)
6
+ でホストします。
7
+
8
+ > 既に登録されている日付を選択するとメッセージボックスが表示される
9
+
10
+ そもそも選択不可なのとダイアログをポンポン出すのは趣味でないので、「選択しないと登録ボタンが押せない」というシナリオにしました。
11
+
12
+ **注意**
13
+ 以下を「参照の追加」で入れる必要があります。
14
+ PresentationCore
15
+ PresentationFramework
16
+ WindowsBase
17
+ WindowsFormsIntegration
18
+
19
+ 日付選択後なぜかボタンを2回押す必要があります^^;
20
+ 正確にはカレンダー以外のフォームのどこかをクリックしてからでないとボタンが反応しない。
21
+ 解決法は探しきれませんでした。
22
+
23
+ ```cs
24
+ using System;
25
+ using System.Drawing;
26
+ using System.Windows.Forms;
27
+ using System.Windows.Forms.Integration;
28
+
29
+ namespace Questions281450
30
+ {
31
+ public partial class Form1 : Form
32
+ {
33
+ private Button button1;
34
+ private System.Windows.Controls.Calendar calendar1;
35
+
36
+ public Form1()
37
+ {
38
+ InitializeComponent();
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);
48
+
49
+ // [WPF]カレンダーコントロール
50
+ calendar1 = new System.Windows.Controls.Calendar
51
+ {
52
+ SelectedDate = null,
53
+ IsTodayHighlighted = false,
54
+ //SelectionMode = System.Windows.Controls.CalendarSelectionMode.SingleDate,
55
+ //FirstDayOfWeek = DayOfWeek.Sunday,
56
+ // 背景色・枠色以外の色変更は可能だが簡単ではない^^;
57
+ //Background = System.Windows.Media.Brushes.LightPink,
58
+ //BorderBrush = System.Windows.Media.Brushes.Blue,
59
+
60
+ };
61
+ calendar1.SelectedDatesChanged += (s, _) => button1.Enabled = calendar1.SelectedDate != null;
62
+
63
+ foreach(var d in getCSV())
64
+ {
65
+ // 選択不可日を追加
66
+ calendar1.BlackoutDates.Add(new System.Windows.Controls.CalendarDateRange(d));
67
+ }
68
+ // 過去を一括選択不可にする
69
+ //calendar1.BlackoutDates.AddDatesInPast();
70
+
71
+ // [WPF]中身を拡大縮小するコントロール(フォーム側でサイズ調整しやすいように)
72
+ var viewbox = new System.Windows.Controls.Viewbox
73
+ {
74
+ Stretch = System.Windows.Media.Stretch.Fill,
75
+ Child = calendar1,
76
+ };
77
+
78
+ // [WinForms]WPFコントロールをフォームに追加するコントロール
79
+ var elementHost1 = new ElementHost
80
+ {
81
+ Child = viewbox,
82
+ Size = new Size(300, 300),
83
+ };
84
+ Controls.Add(elementHost1);
85
+ }
86
+
87
+ // CSVから取得したつもりで
88
+ private DateTime[] getCSV()
89
+ {
90
+ var d = DateTime.Now.Date;
91
+ return new DateTime[]
92
+ {
93
+ d.AddDays(-7),
94
+ d.AddDays(-1),
95
+ d.AddDays(1),
96
+ d.AddDays(7),
97
+ };
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+
104
104
  ![アプリ画像](d7143611c142438a1b1cd51c52079ed8.png)