From 1d01022a0324f895b1bb16c6729aacdd1a16d5b8 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Fri, 2 Feb 2024 00:27:46 +0800 Subject: [PATCH] feat: use another datatemplate collection. --- demo/Ursa.Demo/Pages/DialogDemo.axaml | 8 ++++++- src/Ursa/Controls/Dialog/OverlayDialog.cs | 22 ++++++++++++++++--- src/Ursa/Controls/Dialog/OverlayDialogHost.cs | 17 ++++++++++---- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/demo/Ursa.Demo/Pages/DialogDemo.axaml b/demo/Ursa.Demo/Pages/DialogDemo.axaml index a760153..424de63 100644 --- a/demo/Ursa.Demo/Pages/DialogDemo.axaml +++ b/demo/Ursa.Demo/Pages/DialogDemo.axaml @@ -71,7 +71,13 @@ - + + + + + + + diff --git a/src/Ursa/Controls/Dialog/OverlayDialog.cs b/src/Ursa/Controls/Dialog/OverlayDialog.cs index 323a169..7ae48e8 100644 --- a/src/Ursa/Controls/Dialog/OverlayDialog.cs +++ b/src/Ursa/Controls/Dialog/OverlayDialog.cs @@ -1,4 +1,5 @@ -using Avalonia.Controls; +using Avalonia; +using Avalonia.Controls; using Ursa.Common; namespace Ursa.Controls; @@ -86,7 +87,7 @@ public static class OverlayDialog var host = OverlayDialogManager.GetHost(hostId); if (host is null) return; var view = host.GetDataTemplate(vm)?.Build(vm); - if (view is null) view = new ContentControl(); + if (view is null) view = new ContentControl() { Padding = new Thickness(24) }; view.DataContext = vm; var t = new DialogControl() { @@ -146,11 +147,26 @@ public static class OverlayDialog public static Task ShowCustomModal(Control control, object? vm, string? hostId = null, OverlayDialogOptions? options = null) + { + var host = OverlayDialogManager.GetHost(hostId); + if (host is null) return Task.FromResult(default(TResult)); + var t = new DialogControl() + { + Content = control, + DataContext = vm, + }; + ConfigureDialogControl(t, options); + host?.AddModalDialog(t); + return t.ShowAsync(); + } + + public static Task ShowCustomModal(object? vm, string? hostId = null, + OverlayDialogOptions? options = null) { var host = OverlayDialogManager.GetHost(hostId); if (host is null) return Task.FromResult(default(TResult)); var view = host.GetDataTemplate(vm)?.Build(vm); - if (view is null) view = new ContentControl(); + if (view is null) view = new ContentControl() { Padding = new Thickness(24) }; view.DataContext = vm; var t = new DialogControl() { diff --git a/src/Ursa/Controls/Dialog/OverlayDialogHost.cs b/src/Ursa/Controls/Dialog/OverlayDialogHost.cs index 522f14e..9c3e2c5 100644 --- a/src/Ursa/Controls/Dialog/OverlayDialogHost.cs +++ b/src/Ursa/Controls/Dialog/OverlayDialogHost.cs @@ -19,6 +19,9 @@ public class OverlayDialogHost : Canvas private Point _lastPoint; + + public DataTemplates DialogDataTemplates { get; set; } = new DataTemplates(); + public static readonly StyledProperty OverlayMaskBrushProperty = AvaloniaProperty.Register( nameof(OverlayMaskBrush)); @@ -226,12 +229,18 @@ public class OverlayDialogHost : Canvas { if (o is null) return null; IDataTemplate? result = null; - var templates = this.DataTemplates.ToList(); + var templates = this.DialogDataTemplates; result = templates.FirstOrDefault(a => a.Match(o)); if (result != null) return result; - var resources = this.Resources.Where(a => a.Value is IDataTemplate).Select(a => a.Value) - .OfType(); - result = resources.FirstOrDefault(a => a.Match(o)); + var keys = this.Resources.Keys; + foreach (var key in keys) + { + if (Resources.TryGetValue(key, out var value) && value is IDataTemplate t) + { + result = t; + break; + } + } return result; } } \ No newline at end of file