55 lines
1.7 KiB
C#
55 lines
1.7 KiB
C#
using Avalonia.Threading;
|
|
using ReactiveUI;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace SPTInstaller.ViewModels;
|
|
|
|
public class ViewModelBase : ReactiveObject, IActivatableViewModel, IRoutableViewModel
|
|
{
|
|
public ViewModelActivator Activator { get; } = new();
|
|
|
|
public string? UrlPathSegment => Guid.NewGuid().ToString().Substring(0, 7);
|
|
|
|
public IScreen HostScreen { get; }
|
|
|
|
/// <summary>
|
|
/// Delay the return of the viewmodel
|
|
/// </summary>
|
|
/// <param name="Milliseconds">The amount of time in milliseconds to delay</param>
|
|
/// <returns>The viewmodel after the delay time</returns>
|
|
/// <remarks>Useful to delay the navigation to another view. For instance, to allow an animation to complete.</remarks>
|
|
private async Task<ViewModelBase> WithDelay(int Milliseconds)
|
|
{
|
|
await Task.Delay(Milliseconds);
|
|
|
|
return this;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Navigate to another viewmodel after a delay
|
|
/// </summary>
|
|
/// <param name="ViewModel"></param>
|
|
/// <param name="Milliseconds"></param>
|
|
/// <returns></returns>
|
|
public async Task NavigateToWithDelay(ViewModelBase ViewModel, int Milliseconds)
|
|
{
|
|
await Dispatcher.UIThread.InvokeAsync(async () =>
|
|
{
|
|
HostScreen.Router.Navigate.Execute(await ViewModel.WithDelay(Milliseconds));
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// Navigate to another viewmodel
|
|
/// </summary>
|
|
/// <param name="ViewModel"></param>
|
|
public void NavigateTo(ViewModelBase ViewModel)
|
|
{
|
|
Dispatcher.UIThread.InvokeAsync(() => { HostScreen.Router.Navigate.Execute(ViewModel); });
|
|
}
|
|
|
|
public ViewModelBase(IScreen Host)
|
|
{
|
|
HostScreen = Host;
|
|
}
|
|
} |