Better creation of context menu items for calendar events.

This commit is contained in:
Burak Kaan Köse
2026-04-09 01:01:28 +02:00
parent 832a4b0348
commit aaf0b7d069
4 changed files with 98 additions and 60 deletions
@@ -32,6 +32,7 @@ public sealed partial class CalendarPage : CalendarPageAbstract, ITitleBarSearch
private CancellationTokenSource? _searchCancellationTokenSource;
private long _calendarTypeSelectorChangedToken;
private bool _suppressSelectionResetOnPopupClose;
private bool _hasAttachedNavigationLifetimeEvents;
public ObservableCollection<TitleBarSearchSuggestion> SearchSuggestions { get; } = [];
@@ -42,13 +43,6 @@ public sealed partial class CalendarPage : CalendarPageAbstract, ITitleBarSearch
public CalendarPage()
{
InitializeComponent();
_calendarTypeSelectorChangedToken = CalendarToolbar.RegisterSelectedTypeChanged(CalendarTypeSelectorSelectedTypeChanged);
CalendarToolbar.PreviousDateRequested += CalendarToolbarPreviousDateRequested;
CalendarToolbar.NextDateRequested += CalendarToolbarNextDateRequested;
ViewModel.PropertyChanged += ViewModelPropertyChanged;
CalendarShellClient.PropertyChanged += CalendarShellClientPropertyChanged;
CalendarShellClient.StatePersistenceService.StatePropertyChanged += CalendarStatePersistenceServiceChanged;
Unloaded += CalendarPageUnloaded;
RefreshCalendarToolbar();
}
@@ -61,6 +55,8 @@ public sealed partial class CalendarPage : CalendarPageAbstract, ITitleBarSearch
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
Bindings.Update();
AttachNavigationLifetimeEvents();
RefreshCalendarToolbar();
if (e.NavigationMode == NavigationMode.Back && ViewModel.RestoreVisibleState())
@@ -79,6 +75,12 @@ public sealed partial class CalendarPage : CalendarPageAbstract, ITitleBarSearch
WeakReferenceMessenger.Default.Send(new LoadCalendarMessage(request));
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
DetachNavigationLifetimeEvents();
}
public async Task OnTitleBarSearchTextChangedAsync()
{
_searchCancellationTokenSource?.Cancel();
@@ -272,9 +274,31 @@ public sealed partial class CalendarPage : CalendarPageAbstract, ITitleBarSearch
}
}
private void CalendarPageUnloaded(object sender, RoutedEventArgs e)
private void AttachNavigationLifetimeEvents()
{
if (_hasAttachedNavigationLifetimeEvents)
{
return;
}
_calendarTypeSelectorChangedToken = CalendarToolbar.RegisterSelectedTypeChanged(CalendarTypeSelectorSelectedTypeChanged);
CalendarToolbar.PreviousDateRequested += CalendarToolbarPreviousDateRequested;
CalendarToolbar.NextDateRequested += CalendarToolbarNextDateRequested;
ViewModel.PropertyChanged += ViewModelPropertyChanged;
CalendarShellClient.PropertyChanged += CalendarShellClientPropertyChanged;
CalendarShellClient.StatePersistenceService.StatePropertyChanged += CalendarStatePersistenceServiceChanged;
_hasAttachedNavigationLifetimeEvents = true;
}
private void DetachNavigationLifetimeEvents()
{
if (!_hasAttachedNavigationLifetimeEvents)
{
return;
}
CloseQuickEventPopup(clearSelection: true);
Bindings.StopTracking();
CalendarToolbar.UnregisterSelectedTypeChanged(_calendarTypeSelectorChangedToken);
CalendarToolbar.PreviousDateRequested -= CalendarToolbarPreviousDateRequested;
CalendarToolbar.NextDateRequested -= CalendarToolbarNextDateRequested;
@@ -283,7 +307,8 @@ public sealed partial class CalendarPage : CalendarPageAbstract, ITitleBarSearch
CalendarShellClient.StatePersistenceService.StatePropertyChanged -= CalendarStatePersistenceServiceChanged;
_searchCancellationTokenSource?.Cancel();
_searchCancellationTokenSource?.Dispose();
Unloaded -= CalendarPageUnloaded;
_searchCancellationTokenSource = null;
_hasAttachedNavigationLifetimeEvents = false;
}
private async void SaveQuickEventClicked(object sender, RoutedEventArgs e)