mcpField
S
syncfusion-wpf-scheduler

syncfusion-wpf-scheduler

github.com/syncfusion開発5156 回インストール1 週間前に更新
リポジトリ

syncfusion-wpf-scheduler について

WPF アプリにカレンダー機能を追加する開発者向けの、Syncfusion WPF Scheduler 実装ガイドです。複数のビュー、リソース別スケジュール、タイムゾーン処理、iCalendar の入出力を扱います。

主な機能

  1. 018 種類のカレンダー・タイムラインビュー
  2. 02予定の編集と繰り返し設定
  3. 03複数リソースの分類とスケジュール
  4. 04ドラッグ&ドロップで予定を変更
  5. 05タイムゾーンと夏時間への対応
  6. 06iCalendar のインポートとエクスポート

活用シーン

  1. 01WPF アプリで会議カレンダーを構築
  2. 02複数の人員やリソースの予定を管理
  3. 03繰り返し予定や異なるタイムゾーンの調整
  4. 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.md
getting-started.md
ics-import-export.md
resource-and-advanced-features.md
scheduler-views.md
view-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
});

主要プロパティの概要

コアプロパティ
プロパティ型説明デフォルト
ViewTypeSchedulerViewTypeビューを設定します(Day、Week、WorkWeek、Month、TimelineDay、TimelineWeek、TimelineWorkWeek、TimelineMonth)Month
ItemsSourceIEnumerable表示する予定コレクションnull
DisplayDateDateTime現在表示されている日付DateTime.Now
SelectedDateDateTime?現在選択されている日付null
FirstDayOfWeekDayOfWeek週の開始曜日Sunday
TimeZonestringScheduler のタイムゾーン識別子(null の場合は TimeZoneInfo.Local.Id にフォールバックします)null
ビューのナビゲーションと設定
プロパティ型説明デフォルト
AllowedViewTypesSchedulerViewTypeナビゲーションで使用できるビューの種類All
AllowViewNavigationboolヘッダーのタップ時に週/月/タイムライン月ビューから日/タイムライン日ビューへのナビゲーションを有効にしますfalse
ShowDatePickerButtonboolヘッダーに日付選択ボタンを表示しますtrue
日付範囲プロパティ
プロパティ型説明デフォルト
MinimumDateDateTime表示できる最小日付DateTime.MinValue
MaximumDateDateTime表示できる最大日付DateTime.MaxValue
BlackoutDatesObservableCollection<DateTime>操作を無効にする日付(Month ビューと TimelineMonth ビュー)null
データバインディングとマッピング
プロパティ型説明デフォルト
AppointmentMappingAppointmentMappingカスタムオブジェクトを ScheduleAppointment のプロパティにマッピングしますnull
ResourceMappingResourceMappingカスタムオブジェクトを SchedulerResource のプロパティにマッピングしますnull
ヘッダーのカスタマイズ
プロパティ型説明デフォルト
HeaderHeightdoubleスケジューラーヘッダー(日付ピッカー/ビュー上部の月名ヘッダー)の高さ32 (WPF) / 40 (WinUI)
HeaderTemplateDataTemplateヘッダー用のカスタムテンプレートnull
ViewHeaderHeightdoubleDay/Week/Timeline ビュー内の日付/リソース列ヘッダーの高さ(ViewSettingsBase 上)50
ViewHeaderDateFormatstring列ごとのビューヘッダーの日付書式文字列(TimeSlotViewSettings 上)"%d"
ViewHeaderDayFormatstring列ごとのビューヘッダーの曜日書式文字列(ViewSettingsBase 上)(既定では曜日の短縮名)
ViewHeaderTemplateDataTemplate列ごとのビューヘッダー用のカスタムテンプレートnull
リソースのスケジューリング
プロパティ型説明デフォルト
ResourceCollectionObservableCollection<SchedulerResource>スケジューラーリソースのコレクションnull
ResourceGroupTypeResourceGroupTypeグループ化モード(Resource、Date、None)None
ResourceHeaderTemplateDataTemplateリソースヘッダー用のカスタムテンプレートnull
ResourceHeaderTemplateSelectorDataTemplateSelectorリソースヘッダー用のテンプレートセレクターnull
ビュー固有の設定
プロパティ型説明デフォルト
DaysViewSettingsDaysViewSettingsDay/Week/WorkWeek ビューの設定Default
MonthViewSettingsMonthViewSettingsMonth ビューの設定Default
TimelineViewSettingsTimelineViewSettingsTimeline ビューの設定Default
カレンダーと言語カルチャ
プロパティ型説明デフォルト
CalendarIdentifierstringカレンダーシステム識別子(Gregorian など)Gregorian
UI とインタラクション
プロパティ型説明デフォルト
ShowBusyIndicatorbool処理中に読み込みインジケーターを表示しますfalse
EnableToolTipbool予定のツールチップを有効にしますtrue
ToolTipTemplateDataTemplateツールチップ用のカスタムテンプレートnull
EnableReminderboolリマインダー機能を有効にしますtrue
コンテキストメニュー
プロパティ型説明デフォルト
AppointmentContextMenuContextMenu予定用のコンテキストメニューDefault
CellContextMenuContextMenuセル用のコンテキストメニューDefault
ドラッグ&ドロップ
プロパティ型説明デフォルト
DragDropSettingsDragDropSettingsドラッグ&ドロップの動作を設定しますDefault
予定の編集
プロパティ型説明デフォルト
AppointmentEditFlagAppointmentEditFlag許可する編集操作(Add、Edit、Resize、DragDrop)を制御しますAdd | Edit | Resize | DragDrop
AppointmentResizeControllerAppointmentResizeControllerサイズ変更の動作を制御するカスタムコントローラーnew AppointmentResizeController(this)
オンデマンド読み込み
プロパティ型説明デフォルト
LoadOnDemandCommandICommand表示中の日付範囲の予定をオンデマンドで読み込むために呼び出されるコマンド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ヘッダーがタップ/クリックされたときに発生します

一般的なユースケース

  1. 会議室スケジューラー - リソースごとのグループ化により、会議室の予約を管理します
  2. 診療予約 - 患者の予約や定期枠を含む医師のスケジュールを管理します
  3. プロジェクトのタイムライン - タスク、マイルストーン、チームメンバーの割り当てを追跡します
  4. イベントカレンダー - 終日イベントや複数日にわたるイベントを含む、一般公開イベントを管理します
  5. 従業員のシフト計画 - ドラッグ&ドロップによるリソースベースのシフトスケジュールを作成します
  6. 授業スケジュール - 定期的な授業を含む教育機関の時間割を管理します
  7. サービス予約 - 空き状況の管理機能を備えた予約システムを構築します

重要な考慮事項

  • パフォーマンス: 複数年にわたる大規模なデータセットには 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 がすでに存在する変更済みの繰り返し予定をスキップするため、同じファイルを再インポートしても処理結果は変わりません。

次のステップ

インストールと基本設定についてははじめにから始め、その後、上記のナビゲーションガイドを使って要件に応じた機能を確認してください。

コメント