diff --git a/demo/Ursa.Demo/Pages/DialogDemo.axaml b/demo/Ursa.Demo/Pages/DialogDemo.axaml
index 424de63..ef511f6 100644
--- a/demo/Ursa.Demo/Pages/DialogDemo.axaml
+++ b/demo/Ursa.Demo/Pages/DialogDemo.axaml
@@ -23,58 +23,89 @@
OnContent="Window" />
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
-
-
+
+
+
+
+
-
-
+
+
-
-
+
+
-
+
-
+
diff --git a/demo/Ursa.Demo/ViewModels/DialogDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/DialogDemoViewModel.cs
index 2b7ec92..e26fb45 100644
--- a/demo/Ursa.Demo/ViewModels/DialogDemoViewModel.cs
+++ b/demo/Ursa.Demo/ViewModels/DialogDemoViewModel.cs
@@ -54,6 +54,13 @@ public class DialogDemoViewModel: ObservableObject
get => _isModal;
set => SetProperty(ref _isModal, value);
}
+
+ private bool _canCloseMaskToClose;
+ public bool CanCloseMaskToClose
+ {
+ get => _canCloseMaskToClose;
+ set => SetProperty(ref _canCloseMaskToClose, value);
+ }
private DialogResult? _defaultResult;
public DialogResult? DefaultResult
@@ -110,7 +117,8 @@ public class DialogDemoViewModel: ObservableObject
{
Title = "Please select a date",
Mode = SelectedMode,
- Buttons = SelectedButton
+ Buttons = SelectedButton,
+ CanClickOnMaskToClose = CanCloseMaskToClose,
}
);
Date = vm.Date;
@@ -155,7 +163,10 @@ public class DialogDemoViewModel: ObservableObject
if (IsModal)
{
Result = await OverlayDialog.ShowCustomModal(
- vm, IsGlobal ? null : "LocalHost");
+ vm, IsGlobal ? null : "LocalHost", options: new OverlayDialogOptions()
+ {
+ CanClickOnMaskToClose = CanCloseMaskToClose,
+ });
Date = vm.Date;
}
else
diff --git a/src/Ursa/Controls/Dialog/DialogControl.cs b/src/Ursa/Controls/Dialog/DialogControl.cs
index 4186580..4be0f03 100644
--- a/src/Ursa/Controls/Dialog/DialogControl.cs
+++ b/src/Ursa/Controls/Dialog/DialogControl.cs
@@ -135,4 +135,16 @@ public class DialogControl: ContentControl
{
PseudoClasses.Set(PC_Modal, modal);
}
+
+ public void Close()
+ {
+ if (this.DataContext is IDialogContext context)
+ {
+ context.Close();
+ }
+ else
+ {
+ DialogControlClosing?.Invoke(this, DialogResult.None);
+ }
+ }
}
\ No newline at end of file
diff --git a/src/Ursa/Controls/Dialog/OverlayDialogHost.cs b/src/Ursa/Controls/Dialog/OverlayDialogHost.cs
index 9c3e2c5..c376883 100644
--- a/src/Ursa/Controls/Dialog/OverlayDialogHost.cs
+++ b/src/Ursa/Controls/Dialog/OverlayDialogHost.cs
@@ -32,15 +32,34 @@ public class OverlayDialogHost : Canvas
set => SetValue(OverlayMaskBrushProperty, value);
}
- private Border CreateOverlayMask() => new()
+ private Border CreateOverlayMask(bool canCloseOnClick)
{
- HorizontalAlignment = HorizontalAlignment.Stretch,
- VerticalAlignment = VerticalAlignment.Stretch,
- Width = this.Bounds.Width,
- Height = this.Bounds.Height,
- [!BackgroundProperty] = this[!OverlayMaskBrushProperty],
- IsVisible = true,
- };
+ Border border = new()
+ {
+ HorizontalAlignment = HorizontalAlignment.Stretch,
+ VerticalAlignment = VerticalAlignment.Stretch,
+ Width = this.Bounds.Width,
+ Height = this.Bounds.Height,
+ [!BackgroundProperty] = this[!OverlayMaskBrushProperty],
+ IsVisible = true,
+ };
+ if (canCloseOnClick)
+ {
+ border.AddHandler(PointerReleasedEvent, ClickBorderToCloseDialog);
+ }
+ return border;
+ }
+
+ private void ClickBorderToCloseDialog(object sender, PointerReleasedEventArgs e)
+ {
+ if (sender is Border border)
+ {
+ int i = _masks.IndexOf(border);
+ DialogControl dialog = _modalDialogs[i];
+ dialog.Close();
+ border.RemoveHandler(PointerReleasedEvent, ClickBorderToCloseDialog);
+ }
+ }
protected sealed override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
@@ -138,7 +157,7 @@ public class OverlayDialogHost : Canvas
///
internal void AddModalDialog(DialogControl control)
{
- var mask = CreateOverlayMask();
+ var mask = CreateOverlayMask(control.CanClickOnMaskToClose);
_masks.Add(mask);
_modalDialogs.Add(control);
control.SetAsModal(true);