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

以下は、DialogFactory を設定していない状態で Appointment をダブルクリックした際に表示される、既定の編集ダイアログです。今回はこのダイアログを独自の WPF ウィンドウに置き換えます。

XamScheduleDataManager の設定

既定のダイアログを独自のものに置き換えるには、XamScheduleDataManagerDialogFactory プロパティに、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 で編集内容を破棄してダイアログを閉じることができます。

Tagged:

製品について

Ultimate UI for WPF