diff --git a/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaDialogBase.Statics.cs b/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaDialogBase.Statics.cs index f7b5731..725025f 100644 --- a/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaDialogBase.Statics.cs +++ b/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaDialogBase.Statics.cs @@ -1,3 +1,5 @@ +using System; +using System.Threading.Tasks; using Avalonia.Controls; namespace Pilz.UI.AvaloniaUI.Dialogs; @@ -26,14 +28,14 @@ public partial class AvaloniaDialogBase return dialogPanel; } - private static T CreatePanelInstance(object? tag) where T : AvaloniaFlyoutBase + internal static T CreatePanelInstance(object? tag) where T : AvaloniaFlyoutBase { var dialogPanel = Activator.CreateInstance(); dialogPanel.Tag = tag; return dialogPanel; } - private static AvaloniaDialogBase CreateForm(T dialogPanel, string? title, object? icon, WindowStartupLocation startPosition) where T : AvaloniaFlyoutBase + internal static AvaloniaDialogBase CreateForm(T dialogPanel, string? title, object? icon, WindowStartupLocation startPosition) where T : AvaloniaFlyoutBase { var dialog = new AvaloniaDialogBase { diff --git a/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaFlyoutBase.Statics.cs b/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaFlyoutBase.Statics.cs index 3061ea4..3a5f2e4 100644 --- a/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaFlyoutBase.Statics.cs +++ b/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaFlyoutBase.Statics.cs @@ -1,33 +1,80 @@ +using System; +using System.Linq; +using System.Threading.Tasks; using Avalonia.Controls; +using Avalonia.Media; +using DialogHostAvalonia; +using MsBox.Avalonia.ViewModels; namespace Pilz.UI.AvaloniaUI.Dialogs; public partial class AvaloniaFlyoutBase { - // public static void Show(Control controlToAssociate, object? tag = null) - // { - // Show(controlToAssociate, null, null, tag: tag); - // } - // - // public static void Show(Control controlToAssociate, string? title, RadSvgImage? icon, object? tag = null) - // { - // Show(controlToAssociate, typeof(T), title, icon, tag: tag); - // } - // - // public static void Show(Control controlToAssociate, Type flyoutContentType, string? title, RadSvgImage? icon, object? tag = null) - // { - // tagToAssign = tag; - // titleToAssing = title; - // iconToAssign = icon; - // ParentContext = controlToAssociate; - // CloseFlyout(); // Ensure it's closed! - // RadFlyoutManager.Show(controlToAssociate, flyoutContentType); - // } - // - // protected static void CloseFlyout() - // { - // if (typeof(RadFlyoutManager).GetField("flyoutInstance", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static).GetValue(null) is FlyoutScreen instance - // && instance.IsActive) - // RadFlyoutManager.Close(); - // } + public static void Show(ContentControl owner, string? title, IImage? icon, object? tag = null) where T : AvaloniaFlyoutBase + { + Show(t, owner, title, icon); + } + + public static void Showy(T content, ContentControl owner, string? title, IImage? icon) where T : AvaloniaFlyoutBase + { + Show(t, owner, title, icon); + } + + public async static Task Show(T content, ContentControl owner) where T : AvaloniaFlyoutBase + { + // Add styles + DialogHostStyles? style = null; + if (!owner.Styles.OfType().Any()) + { + style = []; + owner.Styles.Add(style); + } + + // Prepair content + var parentContent = owner.Content; + var dh = new DialogHost + { + Identifier = "FlyoutDialogIdentifier" + Guid.NewGuid() + }; + owner.Content = null; + dh.Content = parentContent; + dh.CloseOnClickAway = content.CancelButtonVisible; + dh.CloseOnClickAwayParameter = "FlyoutDialogIdentifier_Cancel"; + dh.DialogClosing += (ss, ee) => + { + if (ee.Parameter?.ToString() == "FlyoutDialogIdentifier_Cancel") + content.Close(null); + }; + content.OnClose += (s, e) => + { + // ... + }; + owner.Content = dh; + + // Handle close + var tcs = new TaskCompletionSource(); + content.SetCloseAction(() => + { + var r = content.GetButtonResult(); + + if (dh.CurrentSession != null && dh.CurrentSession.IsEnded == false) + { + DialogHost.Close(dh.Identifier); + } + + owner.Content = null; + dh.Content = null; + owner.Content = parentContent; + if (style != null) + { + owner.Styles.Remove(style); + } + tcs.TrySetResult(r); + }); + + // Show dialog + await DialogHost.Show(content, dh.Identifier); + + return content; + } } \ No newline at end of file diff --git a/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaFlyoutBase.axaml.cs b/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaFlyoutBase.axaml.cs index 2f4169a..1205cd7 100644 --- a/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaFlyoutBase.axaml.cs +++ b/Pilz.UI.AvaloniaUI/Dialogs/AvaloniaFlyoutBase.axaml.cs @@ -1,3 +1,4 @@ +using System; using System.ComponentModel; using Avalonia; using Avalonia.Controls; @@ -168,10 +169,15 @@ public partial class AvaloniaFlyoutBase : UserControl { } + protected void Close() + { + OnClose?.Invoke(this, EventArgs.Empty); + } + protected void Close(object? result) { Result = result; - OnClose?.Invoke(this, EventArgs.Empty); + Close(); } protected virtual bool ValidateOK()