Appointment をダブルクリックしたときに表示される既定の編集ダイアログを、独自の WPF ウィンドウ(UserControl)に置き換える方法を紹介します。中心となる API は、XamScheduleDataManager.DialogFactory プロパティに ScheduleDialogFactoryBase を継承したファクトリクラスを設定することです。
以下は、DialogFactory を設定していない状態で Appointment をダブルクリックした際に表示される、既定の編集ダイアログです。今回はこのダイアログを独自の WPF ウィンドウに置き換えます。

XamScheduleDataManager の設定
既定のダイアログを独自のものに置き換えるには、XamScheduleDataManager の DialogFactory プロパティに、ScheduleDialogFactoryBase を継承したファクトリクラスのインスタンスを設定します。
dataManager.DialogFactory = new MyScheduleDialogFactory();
CreateActivityDialog と EndEdit の実装
ファクトリクラスでは CreateActivityDialog メソッドをオーバーライドし、対象アクティビティの種類が Appointment の場合に独自の UserControl(CustomAppointmentDialogControl)を返します。それ以外の場合は base.CreateActivityDialog を呼び出し、既定の動作にフォールバックします。
public class MyScheduleDialogFactory : ScheduleDialogFactoryBase
{
public override FrameworkElement? CreateActivityDialog(
FrameworkElement container,
XamScheduleDataManager dataManager,
ActivityBase activity,
bool allowModifications,
bool allowRemove)
{
if (activity.ActivityType == ActivityType.Appointment)
{
return new CustomAppointmentDialogControl(dataManager, activity, allowModifications);
}
return base.CreateActivityDialog(
container, dataManager, activity, allowModifications, allowRemove);
}
}
独自ダイアログ側では、保存時に EndEdit(activity, false)、キャンセル時に EndEdit(activity, true) を呼び出すことで、編集内容の確定または破棄とダイアログのクローズを XamScheduleDataManager に伝えます。
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
...
_dataManager.EndEdit(_activity, false);
CloseDialog();
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
_dataManager.EndEdit(_activity, true);
CloseDialog();
}
実行結果
DialogFactory に MyScheduleDialogFactory を設定すると、既定のダイアログの代わりに独自の WPF ウィンドウが表示されます。Subject/Start/End/Description を編集し、Save で変更を確定、Cancel で編集内容を破棄してダイアログを閉じることができます。
