diff --git a/demo/Ursa.Demo/Dialogs/CustomDemoDialog.axaml b/demo/Ursa.Demo/Dialogs/CustomDemoDialog.axaml
index 3b38ce3..dc61a44 100644
--- a/demo/Ursa.Demo/Dialogs/CustomDemoDialog.axaml
+++ b/demo/Ursa.Demo/Dialogs/CustomDemoDialog.axaml
@@ -17,7 +17,10 @@
-
+
-
+
-
-
-
+
+
+
A
B
@@ -79,5 +96,5 @@
-
+
diff --git a/src/Ursa/AssemblyInfo.cs b/src/Ursa/AssemblyInfo.cs
index 5fb4320..a45e3de 100644
--- a/src/Ursa/AssemblyInfo.cs
+++ b/src/Ursa/AssemblyInfo.cs
@@ -3,4 +3,5 @@ using Avalonia.Metadata;
[assembly:XmlnsPrefix("https://irihi.tech/ursa", "u")]
[assembly:XmlnsDefinition("https://irihi.tech/ursa", "Ursa")]
[assembly:XmlnsDefinition("https://irihi.tech/ursa", "Ursa.Controls")]
-[assembly:XmlnsDefinition("https://irihi.tech/ursa", "Ursa.Controls.Shapes")]
\ No newline at end of file
+[assembly:XmlnsDefinition("https://irihi.tech/ursa", "Ursa.Controls.Shapes")]
+[assembly:XmlnsDefinition("https://irihi.tech/ursa", "Ursa.Helpers")]
\ No newline at end of file
diff --git a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs
index e2f2be3..86d9c6e 100644
--- a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs
+++ b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Dialog.cs
@@ -4,6 +4,7 @@ using Avalonia.VisualTree;
using Irihi.Avalonia.Shared.Helpers;
using Irihi.Avalonia.Shared.Shapes;
using Ursa.Controls.OverlayShared;
+using Ursa.Helpers;
namespace Ursa.Controls;
@@ -113,12 +114,17 @@ public partial class OverlayDialogHost
control.AddHandler(DialogControlBase.LayerChangedEvent, OnDialogLayerChanged);
if (!IsAnimationDisabled) MaskAppearAnimation.RunAsync(mask);
- var element = control.GetVisualDescendants().OfType().FirstOrDefault(a => a.Focusable);
+ var element = control.GetVisualDescendants().OfType()
+ .FirstOrDefault(FocusHelper.GetDialogFocusHint);
+ if (element is null)
+ {
+ element = control.GetVisualDescendants().OfType().FirstOrDefault(a => a.Focusable);
+ }
element?.Focus();
_modalCount++;
IsInModalStatus = _modalCount > 0;
control.IsClosed = false;
- control.Focus();
+ // control.Focus();
}
// Handle dialog layer change event
diff --git a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Drawer.cs b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Drawer.cs
index 438d8a9..3c3a35b 100644
--- a/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Drawer.cs
+++ b/src/Ursa/Controls/OverlayShared/OverlayDialogHost.Drawer.cs
@@ -9,6 +9,7 @@ using Irihi.Avalonia.Shared.Shapes;
using Ursa.Common;
using Ursa.Controls.OverlayShared;
using Ursa.EventArgs;
+using Ursa.Helpers;
namespace Ursa.Controls;
@@ -69,7 +70,13 @@ public partial class OverlayDialogHost
{
await Task.WhenAll(animation.RunAsync(control), MaskAppearAnimation.RunAsync(mask));
}
- var element = control.GetVisualDescendants().OfType().FirstOrDefault(a => a.Focusable);
+
+ var element = control.GetVisualDescendants().OfType()
+ .FirstOrDefault(FocusHelper.GetDialogFocusHint);
+ if (element is null)
+ {
+ element = control.GetVisualDescendants().OfType().FirstOrDefault(a => a.Focusable);
+ }
element?.Focus();
}
diff --git a/src/Ursa/Helpers/FocusHelper.cs b/src/Ursa/Helpers/FocusHelper.cs
new file mode 100644
index 0000000..2139c81
--- /dev/null
+++ b/src/Ursa/Helpers/FocusHelper.cs
@@ -0,0 +1,13 @@
+using Avalonia;
+using Avalonia.Input;
+
+namespace Ursa.Helpers;
+
+public class FocusHelper
+{
+ public static readonly AttachedProperty DialogFocusHintProperty =
+ AvaloniaProperty.RegisterAttached("DialogFocusHint");
+
+ public static void SetDialogFocusHint(InputElement obj, bool value) => obj.SetValue(DialogFocusHintProperty, value);
+ public static bool GetDialogFocusHint(InputElement obj) => obj.GetValue(DialogFocusHintProperty);
+}
\ No newline at end of file