Загрузка данных
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>