syncfusion-wpf-scheduler について
WPF アプリにカレンダー機能を追加する開発者向けの、Syncfusion WPF Scheduler 実装ガイドです。複数のビュー、リソース別スケジュール、タイムゾーン処理、iCalendar の入出力を扱います。
主な機能
- 018 種類のカレンダー・タイムラインビュー
- 02予定の編集と繰り返し設定
- 03複数リソースの分類とスケジュール
- 04ドラッグ&ドロップで予定を変更
- 05タイムゾーンと夏時間への対応
- 06iCalendar のインポートとエクスポート
活用シーン
- 01WPF アプリで会議カレンダーを構築
- 02複数の人員やリソースの予定を管理
- 03繰り返し予定や異なるタイムゾーンの調整
- 04.ics 形式の予定データを入出力
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ syncfusion/ wpf-ui-components-skills --skill syncfusion-wpf-schedulerインストール後、Claude Code で/syncfusion-wpf-schedulerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/appointments.mdgetting-started.mdics-import-export.mdresource-and-advanced-features.mdscheduler-views.mdview-customization.md詳細
WPF Scheduler (SfScheduler) の実装
WPF Scheduler(SfScheduler)は、Outlook カレンダーのような直感的なユーザーインターフェイスを通じて予定を管理できる、包括的なスケジューリングコントロールです。8 種類のビュー、予定管理、リソースのグループ化、ドラッグ&ドロップ、繰り返しパターン、タイムゾーンサポート、豊富なカスタマイズオプションを備えています。
このスキルを使用する場面
次のようなニーズがある場合に、このスキルを使用します。
- WPF アプリケーションにカレンダーまたはスケジューラー機能を実装する
- 予定管理システムを作成する
- リソーススケジューリングアプリケーションを構築する
- 会議またはイベント管理インターフェイスを実装する
- アプリケーションに Outlook のようなカレンダービューを追加する
- 予定の繰り返しをスケジュールして管理する
- 複数リソースのスケジューリングシナリオに対応する
- 異なるタイムゾーンの予定を表示する
- ドラッグ&ドロップによる予定の再スケジュールを実装する
- カスタムの予定エディターまたはビューを作成する
- 標準の iCalendar(.ics)ファイルから予定をインポート、またはファイルにエクスポートする
- TimelineMonth で特別な時間領域を使って、制限された日付範囲を強調表示する
コンポーネントの概要
主な機能:
- 8 種類の組み込みビュー: Day、Week、WorkWeek、Month、TimelineDay、TimelineWeek、TimelineWorkWeek、TimelineMonth
- 予定管理: 通常の予定、終日予定、複数日にまたがる予定、繰り返し予定に対する完全な CRUD 操作
- リソーススケジューリング: リソースまたは日付によるグループ化を含む、複数リソースのサポート
- ドラッグ&ドロップ: 視覚的なフィードバックを伴う直感的な予定の再スケジュール
- 繰り返しパターン: 例外処理を含む、毎日、毎週、毎月、毎年の繰り返し
- タイムゾーンサポート: 夏時間(DST)の自動調整を含む、複数タイムゾーンへの対応
- 組み込みエディター: 検証機能を備えた予定の作成と編集
- カスタマイズ: 豊富なスタイル設定、テンプレート、外観オプション
- アクセシビリティ: 完全なキーボードナビゲーションを含む WCAG 準拠
- 高度な機能: オンデマンド読み込み、リマインダー、ローカライズ
- ICS(iCalendar)のインポート/エクスポート: 標準の RFC 5545 .ics ファイルとの予定の往復変換
- TimelineMonth の特別な時間領域:
TimelineViewSettings.ShowMonthTimeRegionsを使用した、日付列にまたがるブロックのオプトイン表示
ドキュメントとナビゲーションガイド
はじめに
📄 参照: references/getting-started.md
- アセンブリのデプロイと NuGet パッケージ
- 基本的なスケジューラーアプリケーションの作成(デザイナー、XAML、C#)
- 基本的な予定の設定と構成
- 週の開始日とテーマのサポート
- 初期設定とクイックスタートの例
ビューと表示
📄 参照: references/scheduler-views.md
- 使用できるビューの種類(Day、Week、Month、Timeline 系のビュー)
- ViewType プロパティとビューの切り替え
- ビューごとの機能と描画
- 現在の日付の表示
📄 参照: references/view-customization.md
- 時間間隔とスロットの高さのカスタマイズ
- 営業日と営業時間の設定
- 特別な時間領域(昼休み、休日)
ShowMonthTimeRegionsを使った TimelineMonth の特別な時間領域- タイムスロットの選択制限
予定とデータ
📄 参照: references/appointments.md
- ScheduleAppointment クラスとプロパティ
- 予定の作成と管理
- ItemSource と AppointmentMapping
- カスタムビジネスオブジェクトとデータバインディング
- 終日予定と複数日にまたがる予定
- 繰り返し予定とパターン(RRULE)
- 繰り返しの例外
📄 参照: references/appointment-editing.md
- 組み込みの予定エディター
- UI を使った予定の作成、編集、削除
- エディターのカスタマイズと検証
- エディターのイベントとカスタムロジック
📄 参照: references/appointment-drag-drop.md
- ドラッグ&ドロップ機能
- 予定の再スケジュール
- ドラッグ&ドロップの制限とイベント
iCalendar のインポートとエクスポート
📄 参照: references/ics-import-export.md
ExportToICalendar(fileName)— すべての予定を.icsに書き出します(ダウンロードフォルダー)ImportICalendar()— ファイル選択ダイアログを開き、選択した.icsを解析します- RFC 5545 のマッピング(VCALENDAR / VEVENT / RRULE / EXDATE / RECURRENCE-ID)
- 繰り返しパターンと変更された発生予定の往復変換
- エクスポート時とインポート時のタイムゾーン処理
リソース管理
📄 参照: references/resource-grouping.md
- リソースの概念と SchedulerResource クラス
- ResourceGroupType(リソース別または日付別のグループ化)
- 予定へのリソースの割り当て
- 複数リソースのスケジュール設定
- リソースの外観のカスタマイズ
カレンダーと時間管理
📄 参照: references/calendar-types.md
- カレンダーシステム(グレゴリオ暦、カスタム)
- カレンダーの設定
📄 参照: references/date-navigation.md
- DisplayDate プロパティ
- プログラムによるナビゲーションメソッド
- 日付変更イベント
📄 参照: references/timezones.md
- Scheduler と予定のタイムゾーン
- 自動タイムゾーン変換
- 夏時間の処理
- 複数タイムゾーンのスケジュール設定シナリオ
UI のカスタマイズ
📄 参照: references/ui-features.md
- ヘッダーのカスタマイズとテンプレート
- コンテキストメニューとコマンド
- ビジーインジケーター
- 選択モードとイベント
高度な機能
📄 参照: references/advanced-features.md
- アクセシビリティ(WCAG、キーボードナビゲーション)
- ローカライズと文化圏に応じた書式設定
- 大規模なデータセット向けのオンデマンド読み込み
- リマインダーと通知
- SfSchedule から SfScheduler への移行
クイックスタートの例
予定を含む基本的な Scheduler
XAML:
<Window xmlns:syncfusion="http://schemas.syncfusion.com/wpf">
<syncfusion:SfScheduler x:Name="Schedule"
ViewType="Week"
FirstDayOfWeek="Sunday" />
</Window>
C# コードビハインド:
using Syncfusion.UI.Xaml.Scheduler;
public MainWindow()
{
InitializeComponent();
// Create appointment collection
var appointments = new ScheduleAppointmentCollection();
// Add sample appointment
appointments.Add(new ScheduleAppointment
{
StartTime = DateTime.Now.Date.AddHours(10),
EndTime = DateTime.Now.Date.AddHours(12),
Subject = "Client Meeting",
Location = "Conference Room A",
Notes = "Discuss project timeline",
AppointmentBackground = Brushes.LightBlue
});
Schedule.ItemsSource = appointments;
}
よく使われるパターン
パターン 1:データバインディングを使用したカスタム予定
// Custom business object
public class Meeting : INotifyPropertyChanged
{
public string EventName { get; set; }
public DateTime From { get; set; }
public DateTime To { get; set; }
public Brush Color { get; set; }
public bool IsAllDay { get; set; }
}
// ViewModel
public class SchedulerViewModel
{
public ObservableCollection<Meeting> Events { get; set; }
public SchedulerViewModel()
{
Events = new ObservableCollection<Meeting>
{
new Meeting
{
EventName = "Team Standup",
From = DateTime.Now.Date.AddHours(9),
To = DateTime.Now.Date.AddHours(9.5),
Color = Brushes.Green,
IsAllDay = false
}
};
}
}
XAML:
<syncfusion:SfScheduler x:Name="Schedule"
ViewType="Week"
ItemsSource="{Binding Events}">
<syncfusion:SfScheduler.AppointmentMapping>
<syncfusion:AppointmentMapping
Subject="EventName"
StartTime="From"
EndTime="To"
AppointmentBackground="Color"
IsAllDay="IsAllDay" />
</syncfusion:SfScheduler.AppointmentMapping>
</syncfusion:SfScheduler>
パターン 2:毎週繰り返す会議
var recurringMeeting = new ScheduleAppointment
{
StartTime = new DateTime(2026, 3, 24, 14, 0, 0), // Monday 2PM
EndTime = new DateTime(2026, 3, 24, 15, 0, 0),
Subject = "Weekly Status Meeting",
// Recur every Monday for 12 weeks
RecurrenceRule = "FREQ=WEEKLY;BYDAY=MO;COUNT=12",
AppointmentBackground = Brushes.Orange
};
パターン 3:リソースベースのスケジュール設定
// Add resources
Schedule.ResourceCollection = new ObservableCollection<SchedulerResource>
{
new SchedulerResource { Id = "1001", Name = "Dr. Smith", Background = Brushes.Blue },
new SchedulerResource { Id = "1002", Name = "Dr. Jones", Background = Brushes.Green }
};
Schedule.ResourceGroupType = ResourceGroupType.Resource;
// Assign appointment to resource
var appointment = new ScheduleAppointment
{
StartTime = DateTime.Now.AddHours(2),
EndTime = DateTime.Now.AddHours(3),
Subject = "Patient Consultation",
ResourceIdCollection = new ObservableCollection<object> { "1001" }
};
パターン 4:タイムゾーンを考慮した予定
var globalMeeting = new ScheduleAppointment
{
StartTime = new DateTime(2026, 3, 25, 10, 0, 0),
EndTime = new DateTime(2026, 3, 25, 11, 0, 0),
Subject = "Global Team Sync",
StartTimeZone = "Pacific Standard Time",
EndTimeZone = "Pacific Standard Time"
};
// Scheduler displays in local timezone automatically
Schedule.TimeZone = TimeZoneInfo.Local.Id;
パターン 5:iCalendar のインポート/エクスポート(RFC 5545)
// Export all appointments to a .ics file in the user's Downloads folder
await Schedule.ExportToICalendar("TeamCalendar");
// Import appointments from a .ics file chosen via the system file picker
await Schedule.ImportICalendar();
パターン 6:TimelineMonth の特別な時間帯
// Switch to TimelineMonth and enable special time region rendering
Schedule.ViewType = SchedulerViewType.TimelineMonth;
Schedule.TimelineViewSettings.ShowMonthTimeRegions = true;
// Add a region spanning several days (time-of-day is ignored in TimelineMonth)
Schedule.TimelineViewSettings.SpecialTimeRegions.Add(new SpecialTimeRegion
{
StartTime = new DateTime(2026, 6, 10),
EndTime = new DateTime(2026, 6, 14),
Text = "Audit Week",
Background = new SolidColorBrush(Color.FromRgb(0xF5, 0xE1, 0xB4)),
Foreground = Brushes.Black,
CanEdit = false // blocks drag-drop and new appointments in those columns
});
主要プロパティの概要
コアプロパティ
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| ViewType | SchedulerViewType | ビューを設定します(Day、Week、WorkWeek、Month、TimelineDay、TimelineWeek、TimelineWorkWeek、TimelineMonth) | Month |
| ItemsSource | IEnumerable | 表示する予定コレクション | null |
| DisplayDate | DateTime | 現在表示されている日付 | DateTime.Now |
| SelectedDate | DateTime? | 現在選択されている日付 | null |
| FirstDayOfWeek | DayOfWeek | 週の開始曜日 | Sunday |
| TimeZone | string | Scheduler のタイムゾーン識別子(null の場合は TimeZoneInfo.Local.Id にフォールバックします) | null |
ビューのナビゲーションと設定
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| AllowedViewTypes | SchedulerViewType | ナビゲーションで使用できるビューの種類 | All |
| AllowViewNavigation | bool | ヘッダーのタップ時に週/月/タイムライン月ビューから日/タイムライン日ビューへのナビゲーションを有効にします | false |
| ShowDatePickerButton | bool | ヘッダーに日付選択ボタンを表示します | true |
日付範囲プロパティ
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| MinimumDate | DateTime | 表示できる最小日付 | DateTime.MinValue |
| MaximumDate | DateTime | 表示できる最大日付 | DateTime.MaxValue |
| BlackoutDates | ObservableCollection<DateTime> | 操作を無効にする日付(Month ビューと TimelineMonth ビュー) | null |
データバインディングとマッピング
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| AppointmentMapping | AppointmentMapping | カスタムオブジェクトを ScheduleAppointment のプロパティにマッピングします | null |
| ResourceMapping | ResourceMapping | カスタムオブジェクトを SchedulerResource のプロパティにマッピングします | null |
ヘッダーのカスタマイズ
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| HeaderHeight | double | スケジューラーヘッダー(日付ピッカー/ビュー上部の月名ヘッダー)の高さ | 32 (WPF) / 40 (WinUI) |
| HeaderTemplate | DataTemplate | ヘッダー用のカスタムテンプレート | null |
| ViewHeaderHeight | double | Day/Week/Timeline ビュー内の日付/リソース列ヘッダーの高さ(ViewSettingsBase 上) | 50 |
| ViewHeaderDateFormat | string | 列ごとのビューヘッダーの日付書式文字列(TimeSlotViewSettings 上) | "%d" |
| ViewHeaderDayFormat | string | 列ごとのビューヘッダーの曜日書式文字列(ViewSettingsBase 上) | (既定では曜日の短縮名) |
| ViewHeaderTemplate | DataTemplate | 列ごとのビューヘッダー用のカスタムテンプレート | null |
リソースのスケジューリング
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| ResourceCollection | ObservableCollection<SchedulerResource> | スケジューラーリソースのコレクション | null |
| ResourceGroupType | ResourceGroupType | グループ化モード(Resource、Date、None) | None |
| ResourceHeaderTemplate | DataTemplate | リソースヘッダー用のカスタムテンプレート | null |
| ResourceHeaderTemplateSelector | DataTemplateSelector | リソースヘッダー用のテンプレートセレクター | null |
ビュー固有の設定
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| DaysViewSettings | DaysViewSettings | Day/Week/WorkWeek ビューの設定 | Default |
| MonthViewSettings | MonthViewSettings | Month ビューの設定 | Default |
| TimelineViewSettings | TimelineViewSettings | Timeline ビューの設定 | Default |
カレンダーと言語カルチャ
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| CalendarIdentifier | string | カレンダーシステム識別子(Gregorian など) | Gregorian |
UI とインタラクション
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| ShowBusyIndicator | bool | 処理中に読み込みインジケーターを表示します | false |
| EnableToolTip | bool | 予定のツールチップを有効にします | true |
| ToolTipTemplate | DataTemplate | ツールチップ用のカスタムテンプレート | null |
| EnableReminder | bool | リマインダー機能を有効にします | true |
コンテキストメニュー
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| AppointmentContextMenu | ContextMenu | 予定用のコンテキストメニュー | Default |
| CellContextMenu | ContextMenu | セル用のコンテキストメニュー | Default |
ドラッグ&ドロップ
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| DragDropSettings | DragDropSettings | ドラッグ&ドロップの動作を設定します | Default |
予定の編集
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| AppointmentEditFlag | AppointmentEditFlag | 許可する編集操作(Add、Edit、Resize、DragDrop)を制御します | Add | Edit | Resize | DragDrop |
| AppointmentResizeController | AppointmentResizeController | サイズ変更の動作を制御するカスタムコントローラー | new AppointmentResizeController(this) |
オンデマンド読み込み
| プロパティ | 型 | 説明 | デフォルト |
|---|---|---|---|
| LoadOnDemandCommand | ICommand | 表示中の日付範囲の予定をオンデマンドで読み込むために呼び出されるコマンド | null |
主なメソッド
| メソッド | 説明 |
|---|---|
| Forward() | 1つ先の表示間隔に移動します |
| Backward() | 1つ前の表示間隔に移動します |
| SchedulerDateToPoint(DateTime) | 日付を画面座標に変換します |
| PointToSchedulerDate(Point) | 画面座標を日付/時刻に変換します |
| ExportToICalendar(string fileName = null) | すべての予定をユーザーの Downloads フォルダーに書き込まれる .ics ファイルへ非同期でエクスポートします。Task<bool>(成功時は true)を返します。 |
| ImportICalendar() | 非同期でファイル選択ダイアログを開き、選択した .ics ファイルを解析してスケジューラーに取り込みます。Task<bool>(成功時は true)を返します。 |
主なイベント
| イベント | 説明 |
|---|---|
| ViewChanged | ビューの種類が変更されたときに発生します |
| DisplayDateChanged | 表示日付が変更されたときに発生します |
| SelectionChanged | 選択した日付/予定が変更されたときに発生します |
| CellTapped | セルがタップ/クリックされたときに発生します |
| CellDoubleTapped | セルがダブルクリックされたときに発生します |
| CellLongPressed | セルが長押しされたときに発生します |
| AppointmentTapped | 予定がタップ/クリックされたときに発生します |
| AppointmentDoubleTapped | 予定がダブルクリックされたときに発生します |
| AppointmentDragStarting | 予定のドラッグが開始されたときに発生します(キャンセル可能) |
| AppointmentDragOver | 予定をスケジューラー上でドラッグしている間に発生します |
| AppointmentDrop | 予定がドロップされたときに発生します |
| AppointmentResizeStarting | 予定のサイズ変更が開始されたときに発生します(キャンセル可能) |
| AppointmentResizing | 予定のサイズを変更している間に発生します |
| AppointmentResizeCompleted | 予定のサイズ変更が完了したときに発生します |
| AppointmentEditorOpening | 予定エディターを開くときに発生します(キャンセル可能) |
| AppointmentEditorClosing | 予定エディターを閉じるときに発生します(キャンセル可能) |
| HeaderTapped | ヘッダーがタップ/クリックされたときに発生します |
一般的なユースケース
- 会議室スケジューラー - リソースごとのグループ化により、会議室の予約を管理します
- 診療予約 - 患者の予約や定期枠を含む医師のスケジュールを管理します
- プロジェクトのタイムライン - タスク、マイルストーン、チームメンバーの割り当てを追跡します
- イベントカレンダー - 終日イベントや複数日にわたるイベントを含む、一般公開イベントを管理します
- 従業員のシフト計画 - ドラッグ&ドロップによるリソースベースのシフトスケジュールを作成します
- 授業スケジュール - 定期的な授業を含む教育機関の時間割を管理します
- サービス予約 - 空き状況の管理機能を備えた予約システムを構築します
重要な考慮事項
- パフォーマンス: 複数年にわたる大規模なデータセットには LoadOnDemand を使用してください
- データバインディング: 更新を反映するには、カスタムオブジェクトで INotifyPropertyChanged を実装する必要があります
- 繰り返し: 繰り返しパターンには RRULE 形式を使用してください(標準 RFC 5545)
- タイムゾーン: グローバルアプリケーションでは、必ずタイムゾーンを指定してください
- リソース: ResourceIdCollection の ID は ResourceCollection の ID と一致させる必要があります
- ビュー: ユースケースに適したビューを選択してください(詳細表示には Day、概要表示には Month)
- TimelineMonth の特別な時間帯:
TimelineViewSettings.ShowMonthTimeRegions = trueで有効化します。TimelineMonth では時刻は無視され、描画される範囲はStartTime/EndTimeの日付部分だけで決まります。 - ICS のエクスポート先:
ExportToICalendarは常にユーザーの Downloads フォルダー(%USERPROFILE%\Downloads)に書き込みます。.ics拡張子は自動的に付加されます。 - ICS の重複処理:
ImportICalendarは、Idがすでに存在する予定と、RecurrenceIdがすでに存在する変更済みの繰り返し予定をスキップするため、同じファイルを再インポートしても処理結果は変わりません。
次のステップ
インストールと基本設定についてははじめにから始め、その後、上記のナビゲーションガイドを使って要件に応じた機能を確認してください。