using System;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using DownKyi.PrismExtension.Common;
using Prism.Ioc;
using Prism.Services.Dialogs;
namespace DownKyi.PrismExtension.Dialog;
public class DialogService : Prism.Services.Dialogs.DialogService, IDialogService
{
private readonly IContainerExtension _containerExtension;
/// Initializes a new instance of the class.
/// The
public DialogService(IContainerExtension containerExtension) : base(containerExtension)
{
_containerExtension = containerExtension;
}
public Task ShowDialogAsync(string name, IDialogParameters? parameters, Action? callback = null,
string? windowName = null)
{
return ShowDialogInternal(name, parameters, callback, true, windowName);
}
private Task ShowDialogInternal(string name, IDialogParameters? parameters, Action? callback,
bool isModal, string? windowName = null, Window? parentWindow = null)
{
parameters ??= new DialogParameters();
var dialogWindow = CreateDialogWindow(windowName);
ConfigureDialogWindowEvents(dialogWindow, callback);
ConfigureDialogWindowContent(name, dialogWindow, parameters);
return ShowDialogWindow(dialogWindow, isModal, parentWindow);
}
protected new virtual IDialogWindow CreateDialogWindow(string? name)
{
return string.IsNullOrWhiteSpace(name)
? _containerExtension.Resolve()
: _containerExtension.Resolve(name);
}
protected virtual Task ShowDialogWindow(IDialogWindow dialogWindow, bool isModal, Window? owner = null)
{
if (isModal &&
Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime deskLifetime)
{
// Ref:
// - https://docs.avaloniaui.net/docs/controls/window#show-a-window-as-a-dialog
// - https://github.com/AvaloniaUI/Avalonia/discussions/7924
// (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime)
return dialogWindow.ShowDialog(owner ?? deskLifetime.MainWindow);
}
else
{
dialogWindow.Show();
}
return Task.CompletedTask;
}
///
/// Configure content.
///
/// The name of the dialog to show.
/// The hosting window.
/// The parameters to pass to the dialog.
protected virtual void ConfigureDialogWindowContent(string dialogName, IDialogWindow window,
IDialogParameters parameters)
{
var content = _containerExtension.Resolve