カレンダー、日付、および時刻コントロール

日付コントロールと時刻コントロールを使用することで、その地域に合った標準化された方法で、ユーザーがアプリで日付と時刻を表示および設定できるようにすることができます。 この記事では設計ガイドラインを示し、適切なコントロールを選ぶのに役立ちます。

WinUI 3 ギャラリー アプリには、ほとんどの WinUI 3 コントロールと機能の対話型の例が含まれています。 Microsoft Store からアプリを入手するか、GitHub でソース コードを取得します。

日付または時刻コントロールの選択

4 つの日付および時刻コントロールから選択できますが、シナリオによって使用するコントロールは異なります。 以下の情報を参考にして、アプリに適切なコントロールを選んでください。

Control 説明
カレンダー ビュー カレンダー ビューの例 常に表示されるカレンダーから 1 つの日付または日付の範囲を選ぶ場合に使用します。
カレンダーの日付の選択コントロール カレンダーの日付の選択コントールのスクリーンショット。 コンテキストに沿ったカレンダーから 1 つの日付を選ぶ場合に使用します。
日付の選択コントロール 日付の選択コントロールの例 コンテキスト情報が重要でない既知の 1 つの日付を選ぶ場合に使用します。
時刻の選択ツール 時刻の選択コントロールの例 1 つの時刻を選ぶ場合に使用します。

カレンダー ビュー

CalendarView を使うと、ユーザーはカレンダーを表示し操作できます (カレンダーは、月、年、または 10 年単位で操作できます)。 ユーザーは 1 つの日付や日付の範囲を選ぶことができます。 カレンダー ビューには選択コントロール サーフェイスがなく、カレンダーは常に表示されます。

カレンダー ビューは、月ビュー、年ビュー、10 年ビューという 3 つの個別のビューで構成されています。 既定では、月ビューが開きますが、任意のビューをスタートアップ ビューとして指定できます。

月ビュー、年ビュー、10 年ビューを表示した 3 つのカレンダー ビューのスクリーンショット。

  • ユーザーが複数の日付を選べるようにする必要がある場合は、CalendarView を使う必要があります。
  • ユーザーが 1 つの日付しか選べないようにする必要があり、カレンダーを常に表示する必要がない場合は、CalendarDatePicker または DatePicker コントロールを使うことを検討してください。

カレンダーの日付の選択コントロール

CalendarDatePicker は、カレンダーの曜日や埋まり具合などのコンテキスト情報が必要となるカレンダー ビューから 1 つの日付を選ぶ用途に最適なドロップダウン コントロールです。 追加のコンテキストを提供したり、使用可能な日付を制限したりするように、カレンダーを変更することもできます。

日付が設定されていない場合、エントリ ポイントにはプレースホルダー テキストが表示されます。設定されている場合は、選んだ日付が表示されます。 ユーザーがエントリ ポイントを選ぶと、カレンダー ビューが展開されて、ユーザーが日付を選べるようになります。 カレンダー ビューは他の UI をオーバーレイし、他の UI を別の位置に移動させることはありません。

空の日付選択テキスト ボックスが表示されたカレンダーの日付の選択コントロールと、日付が入力されて下にカレンダーが表示されている状態のスクリーンショット。

  • カレンダーの日付の選択コントロールは、予定日や出発日の選択などに使います。

日付の選択コントロール

DatePicker コントロールによって、標準化された方法で特定の日付を選ぶことができます。

エントリ ポイントには、選んだ日付が表示されます。ユーザーがエントリ ポイントを選ぶと、選択ツール サーフェイスが中央から縦方向に展開されて、日付を選べるようになります。 日付の選択は他の UI をオーバーレイし、他の UI を別の位置に移動させることはありません。

展開した日付の選択コントロールの例

  • 日付の選択コントロールは、ユーザーが誕生日などの既知の日付 (カレンダーのコンテキストが重要ではない日) を選べるようにする場合に使用します。

時刻の選択ツール

TimePicker は、予定や出発時刻などの 1 つの時刻を選択する場合に使用します。 ユーザーまたはコードによって設定された静的な表示であるため、更新して現在の時刻を表示することはできません。

エントリ ポイントには、選んだ時刻が表示されます。ユーザーがエントリ ポイントを選ぶと、選択ツール サーフェスが中央から縦方向に展開されて、時刻を選べるようになります。 時刻の選択は他の UI をオーバーレイし、他の UI を別の位置に移動させることはありません。

展開した時刻の選択コントロールの例

  • 時刻の選択コントロールを使って、ユーザーが 1 つの時刻を選べるようにします。

日付または時刻コントロールの作成

日付および時刻コントロールの詳細と例については、次の記事をご覧ください。

日付の選択と時刻の選択を一緒に使用する

次の例で、DatePickerTimePicker を一緒に使用して、ユーザーが到着日時を選択できるようにする方法を示します。 SelectedDateChanged イベントと SelectedTimeChanged イベントを処理して、arrivalDateTime という名前の単一の DateTime インスタンスを更新します。 ユーザーは、設定された日付の選択と時刻の選択を後からクリアすることもできます。

日付の選択、時刻の選択、ボタン、テキスト ラベル。

<StackPanel>
    <DatePicker x:Name="arrivalDatePicker" Header="Arrival date"
                DayFormat="{}{day.integer} ({dayofweek.abbreviated})"
                SelectedDateChanged="ArrivalDatePicker_SelectedDateChanged"/>
    <StackPanel Orientation="Horizontal">
        <TimePicker x:Name="arrivalTimePicker" Header="Arrival time"
                MinuteIncrement="15"
                SelectedTimeChanged="ArrivalTimePicker_SelectedTimeChanged"/>
        <Button Content="Clear" Click="ClearDateButton_Click"
                VerticalAlignment="Bottom" Height="30" Width="54"/>
    </StackPanel>
    <TextBlock x:Name="arrivalText" Margin="0,12"/>
</StackPanel>
public sealed partial class MainPage : Page
{
    DateTime arrivalDateTime;

    public MainPage()
    {
        this.InitializeComponent();

        // Set minimum to the current year and maximum to five years from now.
        arrivalDatePicker.MinYear = DateTimeOffset.Now;
        arrivalDatePicker.MaxYear = DateTimeOffset.Now.AddYears(5);
    }

    private void ArrivalTimePicker_SelectedTimeChanged(TimePicker sender, TimePickerSelectedValueChangedEventArgs args)
    {
        if (arrivalTimePicker.SelectedTime != null)
        {
            arrivalDateTime = new DateTime(arrivalDateTime.Year, arrivalDateTime.Month, arrivalDateTime.Day,
                                           args.NewTime.Value.Hours, args.NewTime.Value.Minutes, args.NewTime.Value.Seconds);
        }
        arrivalText.Text = arrivalDateTime.ToString();
    }

    private void ArrivalDatePicker_SelectedDateChanged(DatePicker sender, DatePickerSelectedValueChangedEventArgs args)
    {
        if (arrivalDatePicker.SelectedDate != null)
        {
            if (VerifyDateIsFuture((DateTimeOffset)arrivalDatePicker.SelectedDate) == true)
            {
                arrivalDateTime = new DateTime(args.NewDate.Value.Year, args.NewDate.Value.Month, args.NewDate.Value.Day,
                                               arrivalDateTime.Hour, arrivalDateTime.Minute, arrivalDateTime.Second);
                arrivalText.Text = arrivalDateTime.ToString();
            }
            else
            {
                arrivalDatePicker.SelectedDate = null;
                arrivalText.Text = "Arrival date must be later than today.";
            }
        }
    }

    private bool VerifyDateIsFuture(DateTimeOffset date)
    {
        if (date > DateTimeOffset.Now)
        {
            return true;
        }
        return false;
    }

    private void ClearDateButton_Click(object sender, RoutedEventArgs e)
    {
        arrivalDateTime = new DateTime();
        arrivalDatePicker.SelectedDate = null;
        arrivalTimePicker.SelectedTime = null;
        arrivalText.Text = string.Empty;
    }
}

グローバリゼーション

XAML の日付のコントロールでは、Windows でサポートされる各カレンダー システムがサポートされます。 それらのカレンダーは Windows.Globalization.CalendarIdentifiers クラスで指定されます。 各コントロールは、アプリの既定の言語に適したカレンダーを使います。または、CalendarIdentifier プロパティを設定して特定のカレンダー システムを使うこともできます。

時刻の選択コントロールでは、Windows.Globalization.ClockIdentifiers クラスで指定される各クロック システムがサポートされます。 ClockIdentifier プロパティを設定し、12 時間形式または 24 時間形式を指定できます。 プロパティの型は文字列ですが、ClockIdentifiers クラスの静的な文字列プロパティに対応する値を使用する必要があります。 それらの値とは、TwelveHour (文字列 "12HourClock") と TwentyFourHour (文字列 "24HourClock") です。 既定値は "12HourClock" です。

DateTime と Calendar の値

XAML の日付および時刻コントロールで使用される日付オブジェクトでは、プログラミング言語によって表現方法が異なります。

関連する概念として Calendar クラスがあります。Calendar クラスは、コンテキストでの日付の解釈方法に影響を及ぼします。 すべての Windows ランタイム アプリで、Windows.Globalization.Calendar クラスを使用することができます。 C# および Visual Basic アプリでは、代わりに機能が非常によく似た System.Globalization.Calendar クラスを使用することができます (Windows ランタイム アプリでは、基本の .NET Calendar クラスを使用することはできますが、GregorianCalendar などの具体的な実装を使用することはできません)。

.NET では、DateTime という名前の型もサポートされます。これは、暗黙的に DateTimeOffset と読み替えることができます。 したがって、.NET コードで値を設定するために "DateTime" 型が使用されていた場合、それは実際には DateTimeOffset です。 DateTime と DateTimeOffset の違いについて詳しくは、「DateTimeOffset クラス」の「注釈」をご覧ください。

注意

日付オブジェクトを受け取るプロパティは、XAML 属性文字列として設定することはできません。これは、Windows ランタイム XAML パーサーには、文字列を DateTime/DateTimeOffset オブジェクトとして日付に変換する変換ロジックがないためです。 通常、それらの値はコードで設定します。 考えられる別の方法として、データ オブジェクトとして (またはデータ コンテキストで) 利用可能な日付を定義し、その日付をデータとしてアクセスできる {Binding} マークアップ拡張表現を参照する XAML 属性をプロパティとして設定することができます。

サンプル コードの入手

開発者向け (XAML)