Загрузка данных


C#:
using Microsoft.UI;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media;
using System;
using System.Collections.Generic;
using Windows.Graphics;

namespace Calendar
{
    public sealed partial class MainWindow : Window
    {
        DateTime currentMonth = DateTime.Now;
        int selectedDay;
        Dictionary<DateTime, List<string>> events = new();

        public MainWindow()
        {
            this.InitializeComponent();

            this.Title = "Календарь";
            var appWindow = this.AppWindow;
            appWindow.Resize(new SizeInt32(1000, 700));

            // Автоматически выбираем сегодняшний день
            selectedDay = DateTime.Now.Day;

            RenderCalendar();
        }

        private void RenderCalendar()
        {
            var AccentColor = new SolidColorBrush((Windows.UI.Color)Application.Current.Resources["SystemAccentColor"]);
            DaysGrid.Children.Clear();
            MonthTitle.Text = currentMonth.ToString("MMMM yyyy");

            var first = new DateTime(currentMonth.Year, currentMonth.Month, 1);
            int start = ((int)first.DayOfWeek + 6) % 7;
            int days = DateTime.DaysInMonth(currentMonth.Year, currentMonth.Month);

            int row = 0;
            int col = start;

            for (int day = 1; day <= days; day++)
            {
                int capturedDay = day;

                var border = new Border
                {
                    CornerRadius = new CornerRadius(6),
                    Margin = new Thickness(4),
                    Background = new SolidColorBrush(Colors.Transparent),
                    BorderBrush = new SolidColorBrush(Colors.Transparent),
                    BorderThickness = new Thickness(1)
                };

                var text = new TextBlock
                {
                    Text = capturedDay.ToString(),
                    FontSize = 20,
                    HorizontalAlignment = HorizontalAlignment.Center,
                    VerticalAlignment = VerticalAlignment.Center,
                    Foreground = (SolidColorBrush)Application.Current.Resources["TextFillColorPrimaryBrush"]
                };

                border.Child = text;

                // Подсветка сегодняшнего дня
                if (currentMonth.Year == DateTime.Now.Year &&
                    currentMonth.Month == DateTime.Now.Month &&
                    capturedDay == DateTime.Now.Day)
                {
                    border.BorderBrush = AccentColor;
                    border.BorderThickness = new Thickness(2);
                }

                // Подсветка выбранного дня
                if (capturedDay == selectedDay)
                {
                    border.Background = AccentColor;
                    text.Foreground = new SolidColorBrush(Colors.White);
                }

                // Обработчик клика
                border.Tapped += (s, e) =>
                {
                    selectedDay = capturedDay;
                    RenderCalendar();
                };

                Grid.SetRow(border, row);
                Grid.SetColumn(border, col);
                DaysGrid.Children.Add(border);

                col++;
                if (col > 6)
                {
                    col = 0;
                    row++;
                }
            }

            // Обновляем заголовок и список событий
            if (selectedDay > 0)
            {
                var selectedDate = new DateTime(currentMonth.Year, currentMonth.Month, selectedDay);
                EventsTitle.Text = $"События {selectedDate:dd MMMM yyyy}";
            }
            else
            {
                EventsTitle.Text = "События дня";
            }

            RenderEvents();
        }

        private void RenderEvents()
        {
            var selectedDate = new DateTime(currentMonth.Year, currentMonth.Month, selectedDay);

            if (events.ContainsKey(selectedDate) && events[selectedDate].Count > 0)
            {
                EventsList.ItemsSource = events[selectedDate];
            }
            else
            {
                EventsList.ItemsSource = new List<string> { "Пока нет событий." };
            }
        }

        private async void AddEvent_Click(object sender, RoutedEventArgs e)
        {
            var dialog = new ContentDialog
            {
                Title = "Новое событие",
                Content = new TextBox { PlaceholderText = "Введите описание события" },
                PrimaryButtonText = "Добавить",
                CloseButtonText = "Отмена",
                XamlRoot = this.Content.XamlRoot
            };

            var result = await dialog.ShowAsync();
            if (result == ContentDialogResult.Primary)
            {
                var textBox = (TextBox)dialog.Content;
                var eventText = textBox.Text;

                var selectedDate = new DateTime(currentMonth.Year, currentMonth.Month, selectedDay);
                if (!events.ContainsKey(selectedDate))
                    events[selectedDate] = new List<string>();

                events[selectedDate].Add(eventText);
                RenderEvents();
            }
        }

        private void PrevMonth_Click(object sender, RoutedEventArgs e)
        {
            currentMonth = currentMonth.AddMonths(-1);
            selectedDay = DateTime.Now.Month == currentMonth.Month && DateTime.Now.Year == currentMonth.Year
                ? DateTime.Now.Day
                : 1;
            RenderCalendar();
        }

        private void NextMonth_Click(object sender, RoutedEventArgs e)
        {
            currentMonth = currentMonth.AddMonths(1);
            selectedDay = DateTime.Now.Month == currentMonth.Month && DateTime.Now.Year == currentMonth.Year
                ? DateTime.Now.Day
                : 1;
            RenderCalendar();
        }
    }
}

XAML:
<Window
    x:Class="Calendar.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Padding="20">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="3*"/>
            <ColumnDefinition Width="2*"/>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!-- Заголовок месяца -->
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Grid.ColumnSpan="2">
            <Button Content="◀" Click="PrevMonth_Click"/>
            <TextBlock x:Name="MonthTitle"
                       FontSize="28"
                       Margin="20,0"
                       VerticalAlignment="Center"/>
            <Button Content="▶" Click="NextMonth_Click"/>
        </StackPanel>

        <!-- Заголовки дней недели -->
        <Grid Grid.Row="1" Grid.Column="0" Margin="0,20,0,10">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <TextBlock Text="Пн" HorizontalAlignment="Center"/>
            <TextBlock Text="Вт" Grid.Column="1" HorizontalAlignment="Center"/>
            <TextBlock Text="Ср" Grid.Column="2" HorizontalAlignment="Center"/>
            <TextBlock Text="Чт" Grid.Column="3" HorizontalAlignment="Center"/>
            <TextBlock Text="Пт" Grid.Column="4" HorizontalAlignment="Center"/>
            <TextBlock Text="Сб" Grid.Column="5" HorizontalAlignment="Center"/>
            <TextBlock Text="Вс" Grid.Column="6" HorizontalAlignment="Center"/>
        </Grid>

        <!-- Сетка дат -->
        <Grid x:Name="DaysGrid" Grid.Row="2" Grid.Column="0">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>

            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
        </Grid>

        <!-- Правая панель -->
        <Border Grid.Row="1" Grid.RowSpan="2" Grid.Column="1"
                Margin="20,0,0,0"
                CornerRadius="8"
                Background="{ThemeResource LayerFillColorDefaultBrush}"
                BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
                BorderThickness="1">
            <StackPanel Padding="20">
                <TextBlock x:Name="EventsTitle"
                           Text="События дня"
                           FontSize="20"
                           FontWeight="SemiBold"
                           Margin="0,0,0,10"/>
                <ListBox x:Name="EventsList"
                         FontSize="16"
                         Opacity="0.9"
                         Margin="0,0,0,10"/>
                <Button Content="Добавить событие"
                        Click="AddEvent_Click"/>
            </StackPanel>
        </Border>
    </Grid>
</Window>