Sdílet prostřednictvím


Zobrazení kalendáře

Zobrazení kalendáře umožňuje uživateli zobrazit a pracovat s kalendářem, který může procházet podle měsíce, roku nebo desetiletí. Uživatel může vybrat jedno datum nebo rozsah kalendářních dat. Nemá výběrovou plochu a kalendář je vždy viditelný.

Je to správná kontrola?

Zobrazení kalendáře umožňuje uživateli vybrat jedno datum nebo rozsah kalendářních dat z vždy viditelného kalendáře.

Pokud potřebujete uživateli povolit výběr více kalendářních dat najednou, musíte použít zobrazení kalendáře. Pokud potřebujete, aby si uživatel vybral jen jedno datum a kalendář nemusí být stále viditelný, zvažte použití ovládacího prvku pro výběr data kalendáře nebo ovládacího prvku pro výběr data.

Další informace o výběru správného ovládacího prvku najdete v článku Ovládací prvky data a času .

Examples

Zobrazení kalendáře se skládá ze 3 samostatných zobrazení: zobrazení měsíce, zobrazení roku a desetiletí. Ve výchozím nastavení začíná otevřeným zobrazením měsíce. Spouštěcí zobrazení můžete určit nastavením Vlastnosti DisplayMode .

Tři pohledy na kalendář

Uživatelé kliknou na záhlaví v zobrazení měsíce, aby otevřeli zobrazení roku, a kliknutím na záhlaví v zobrazení roku otevřete zobrazení desetiletí. Uživatelé vyberou rok v zobrazení desetiletí, aby se vrátili do zobrazení roku, a výběrem měsíce v zobrazení roku se vrátíte do zobrazení měsíce. Dvě šipky vedle záhlaví přecházejí dopředu nebo dozadu podle měsíců, podle roků nebo po desetiletích.

Vytvoření zobrazení kalendáře

Ikona galerie WinUI 3 Aplikace Galerie WinUI 3 obsahuje interaktivní příklady ovládacích prvků a funkcí WinUI. Získejte aplikaci z Microsoft Store nebo vyhledejte zdrojový kód na GitHub.

Tento příklad ukazuje, jak vytvořit jednoduché zobrazení kalendáře.

<CalendarView/>

Výsledné zobrazení kalendáře vypadá takto:

Příklad zobrazení kalendáře

Výběr kalendářních dat

Ve výchozím nastavení je vlastnost SelectionMode nastavena na Single. To umožňuje uživateli vybrat jedno datum v kalendáři. Nastavte selectionMode na None (Žádný ) a zakažte výběr data.

Nastavte SelectionMode na Více , aby uživatel vybral více kalendářních dat. Více kalendářních dat můžete programově vybrat přidáním objektů DateTime/DateTimeOffset do kolekce SelectedDates , jak je znázorněno zde:

calendarView1.SelectedDates.Add(DateTimeOffset.Now);
calendarView1.SelectedDates.Add(new DateTime(1977, 1, 5));

Uživatel může zrušit výběr vybraného data kliknutím nebo klepnutím v mřížce kalendáře.

Událost SelectedDatesChanged můžete zpracovat tak, aby byla upozorněna, když se změnila kolekce SelectedDates .

Poznámka:

Důležité informace o hodnotách kalendářních dat naleznete v části Hodnoty DateTime a Calendar v článku Ovládací prvky data a času.

Přizpůsobení vzhledu zobrazení kalendáře

Zobrazení kalendáře se skládá z obou elementů XAML definovaných v ovládacím prvku ControlTemplate a vizuálních prvků vykreslovaných přímo ovládacím prvku.

  • Prvky XAML definované v šabloně ovládacího prvku zahrnují ohraničení, které ohraničuje ovládací prvek, záhlaví, předchozí a další tlačítka a prvky DayOfWeek. Tyto prvky můžete stylovat a znovu šablonovat jako jakýkoliv ovládací prvek XAML.
  • Mřížka kalendáře se skládá z CalendarViewDayItem objektů. Tyto prvky nemůžete stylovat ani znovu šablonovat, ale jsou k dispozici různé vlastnosti, které vám umožní přizpůsobit jejich vzhled.

Tento diagram znázorňuje prvky, které tvoří zobrazení měsíce v kalendáři. Další informace naleznete v poznámkách k třídě CalendarViewDayItem.

Prvky zobrazení kalendářního měsíce

Tato tabulka obsahuje seznam vlastností, které můžete změnit a změnit vzhled prvků kalendáře.

prvek Vlastnosti
den v týdnu Formát dneTýdne
Položka kalendáře CalendarItemBackground, CalendarItemBorderBrush, CalendarItemBorderThickness, CalendarItemForeground
DayItem DayItemFontFamily, DayItemFontSize, DayItemFontStyle, DayItemFontWeight, HorizontalDayItemAlignment, VerticalDayItemAlignment, CalendarViewDayItemStyle
MonthYearItem (v zobrazeních roku a desetiletí, ekvivalent dayItem) MonthYearItemFontFamily, MonthYearItemFontSize, MonthYearItemFontStyle, MonthYearItemFontWeight
Štítek začátku měsíce FirstOfMonthLabelFontFamily, FirstOfMonthLabelFontSize, FirstOfMonthLabelFontStyle, FirstOfMonthLabelFontWeight, HorizontalFirstOfMonthLabelAlignment, VerticalFirstOfMonthLabelAlignment, IsGroupLabelVisible
FirstofYearDecadeLabel (v roce a desetiletí zobrazení, ekvivalentní FirstOfMonthLabel) PrvníRokDekádaŠtítekFontRodina, PrvníRokDekádaŠtítekVelikostpísma, PrvníRokDekádaŠtítekStylPísmo,PrvníRokDekádaŠtítekHmotnost písma
Vizuální hranice stavů FocusBorderBrush, HoverBorderBrush, PressedBorderBrush, SelectedBorderBrush, SelectedForeground, SelectedHoverBorderBrush, SelectedPressedBorderBrush
Mimo rozsah IsOutOfScopeEnabled, OutOfScopeBackground, OutOfScopeForeground
Dnes IsTodayHighlighted, TodayFontWeight, TodayForeground

Ve výchozím nastavení se v zobrazení měsíce zobrazuje 6 týdnů najednou. Počet týdnů zobrazených nastavením Vlastnosti NumberOfWeeksInView můžete změnit. Minimální počet týdnů, které se mají zobrazit, je 2; maximum je 8.

Ve výchozím nastavení se zobrazení roku a desetiletí objeví ve formátu 4x4 mřížky. Pokud chcete změnit počet řádků nebo sloupců, zavolejte SetYearDecadeDisplayDimensions s požadovaným počtem řádků a sloupců. Tím se změní mřížka pro zobrazení roku i desetiletí.

Tady jsou zobrazení roku a desetiletí nastavena tak, aby se zobrazovala v mřížce 3x4.

calendarView1.SetYearDecadeDisplayDimensions(3, 4);

Ve výchozím nastavení je minimální datum zobrazené v zobrazení kalendáře 100 let před aktuálním datem a maximální zobrazené datum je 100 let za aktuálním datem. Minimální a maximální datum, která kalendář zobrazuje, můžete změnit nastavením vlastností MinDate a MaxDate .

calendarView1.MinDate = new DateTime(2000, 1, 1);
calendarView1.MaxDate = new DateTime(2099, 12, 31);

Aktualizace položek dnů v kalendáři

Každý den v kalendáři je reprezentován CalendarViewDayItem objekt. Chcete-li získat přístup k jednotlivé položce dne a použít její vlastnosti a metody, zpracujte událost CalendarViewDayItemChanging a použijte vlastnost Item argumentů události pro přístup k CalendarViewDayItem.

Můžete učinit den nevybratelným v zobrazení kalendáře nastavením jeho vlastnosti CalendarViewDayItem.IsBlackout na true.

Kontextové informace o hustotě událostí za den můžete zobrazit voláním CalendarViewDayItem.SetDensityColors metoda. Pro každý den můžete zobrazit 0 až 10 pruhů hustoty a nastavit barvu každého pruhu.

Tady jsou některé položky dne v kalendáři. Dny 1 a 2 jsou začerněné. Dny 3 a 4 mají různé úrovně indikátorů hustoty.

Kalendářní dny s hustotními pruhy

Fázované vykreslování

Zobrazení kalendáře může obsahovat velký počet objektů CalendarViewDayItem. Aby uživatelské rozhraní reagovalo a umožnilo plynulou navigaci v kalendáři, podporuje zobrazení kalendáře postupné vykreslování. Díky tomu můžete rozdělit zpracování položky dne do fází. Pokud se den před dokončením všech fází přesune mimo zobrazení, již se nebude věnovat čas pokusům o zpracování a vykreslení této položky.

Tento příklad ukazuje postupné vykreslování zobrazení kalendáře pro plánování událostí.

  • Ve fázi 0 se vykreslí výchozí denní položka.
  • Ve fázi 1 zablokujete data, která není možné rezervovat. To zahrnuje minulé termíny, neděle a data, která jsou již plně zarezervovaná.
  • Ve fázi 2 zkontrolujete každou schůzku, která je rezervována pro daný den. Pro každou potvrzenou schůzku se zobrazí zelený pruh hustoty a modrý pruh hustoty pro každou nezávaznou schůzku.

Třída Bookings v tomto příkladu pochází z fiktivní aplikace pro rezervaci událostí a nezobrazuje se.

<CalendarView CalendarViewDayItemChanging="CalendarView_CalendarViewDayItemChanging"/>
private void CalendarView_CalendarViewDayItemChanging(CalendarView sender,
                                   CalendarViewDayItemChangingEventArgs args)
{
    // Render basic day items.
    if (args.Phase == 0)
    {
        // Register callback for next phase.
        args.RegisterUpdateCallback(CalendarView_CalendarViewDayItemChanging);
    }
    // Set blackout dates.
    else if (args.Phase == 1)
    {
        // Blackout dates in the past, Sundays, and dates that are fully booked.
        if (args.Item.Date < DateTimeOffset.Now ||
            args.Item.Date.DayOfWeek == DayOfWeek.Sunday ||
            Bookings.HasOpenings(args.Item.Date) == false)
        {
            args.Item.IsBlackout = true;
        }
        // Register callback for next phase.
        args.RegisterUpdateCallback(CalendarView_CalendarViewDayItemChanging);
    }
    // Set density bars.
    else if (args.Phase == 2)
    {
        // Avoid unnecessary processing.
        // You don't need to set bars on past dates or Sundays.
        if (args.Item.Date > DateTimeOffset.Now &&
            args.Item.Date.DayOfWeek != DayOfWeek.Sunday)
        {
            // Get bookings for the date being rendered.
            var currentBookings = Bookings.GetBookings(args.Item.Date);

            List<Color> densityColors = new List<Color>();
            // Set a density bar color for each of the days bookings.
            // It's assumed that there can't be more than 10 bookings in a day. Otherwise,
            // further processing is needed to fit within the max of 10 density bars.
            foreach (booking in currentBookings)
            {
                if (booking.IsConfirmed == true)
                {
                    densityColors.Add(Colors.Green);
                }
                else
                {
                    densityColors.Add(Colors.Blue);
                }
            }
            args.Item.SetDensityColors(densityColors);
        }
    }
}