Files
Wino-Mail/Wino.Mail.WinUI/BasePage.cs
Burak Kaan Köse ca19297b92 Some more cleanup.
2026-04-05 13:18:50 +02:00

124 lines
3.3 KiB
C#

using System;
using System.Diagnostics;
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Navigation;
using Wino.Core.ViewModels;
using Wino.Messaging.Client.Shell;
using WinoNavigationMode = Wino.Core.Domain.Models.Navigation.NavigationMode;
namespace Wino.Mail.WinUI;
public partial class BasePage : Page, IRecipient<LanguageChanged>
{
private bool _isPreparedForClose;
public void Receive(LanguageChanged message)
{
OnLanguageChanged();
}
public virtual void OnLanguageChanged() { }
/// <summary>
/// Register message recipients for this page. Override to register specific message types.
/// </summary>
protected virtual void RegisterRecipients() { }
/// <summary>
/// Unregister message recipients for this page. Override to unregister specific message types.
/// </summary>
protected virtual void UnregisterRecipients() { }
public virtual CoreBaseViewModel? AssociatedViewModel => null;
public virtual void PrepareForClose()
{
if (_isPreparedForClose)
return;
_isPreparedForClose = true;
WeakReferenceMessenger.Default.Unregister<LanguageChanged>(this);
UnregisterRecipients();
}
protected void ResetPreparedForCloseState()
{
_isPreparedForClose = false;
}
protected bool IsPreparedForClose => _isPreparedForClose;
}
public abstract class BasePage<T> : BasePage where T : CoreBaseViewModel
{
public T ViewModel { get; } = WinoApplication.Current.Services.GetService<T>() ?? throw new ArgumentException($"Can't resolve '{typeof(T)}' as view model.");
public override CoreBaseViewModel AssociatedViewModel => ViewModel;
protected BasePage()
{
ViewModel.Dispatcher = new WinUIDispatcher(DispatcherQueue);
Loaded += PageLoaded;
Unloaded += PageUnloaded;
}
private void PageUnloaded(object sender, RoutedEventArgs e)
{
Loaded -= PageLoaded;
Unloaded -= PageUnloaded;
}
private void PageLoaded(object sender, RoutedEventArgs e) => ViewModel.OnPageLoaded();
~BasePage() { Debug.WriteLine($"Disposed {GetType().Name}"); }
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
var mode = GetNavigationMode(e.NavigationMode);
var parameter = e.Parameter;
ResetPreparedForCloseState();
WeakReferenceMessenger.Default.Register<LanguageChanged>(this);
RegisterRecipients();
ViewModel.OnNavigatedTo(mode, parameter);
}
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
base.OnNavigatingFrom(e);
var mode = GetNavigationMode(e.NavigationMode);
var parameter = e.Parameter;
PrepareForClose(mode, parameter);
GC.Collect();
}
public override void PrepareForClose()
{
PrepareForClose(WinoNavigationMode.New, null);
}
private void PrepareForClose(WinoNavigationMode mode, object? parameter)
{
if (IsPreparedForClose)
return;
base.PrepareForClose();
ViewModel.OnNavigatedFrom(mode, parameter!);
}
private WinoNavigationMode GetNavigationMode(NavigationMode mode)
{
return (WinoNavigationMode)mode;
}
}