Merge pull request #481 from irihitech/issue-479
Allow user to set Modal Dialog initial focus element
This commit is contained in:
@@ -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")]
|
||||
[assembly:XmlnsDefinition("https://irihi.tech/ursa", "Ursa.Controls.Shapes")]
|
||||
[assembly:XmlnsDefinition("https://irihi.tech/ursa", "Ursa.Helpers")]
|
||||
@@ -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;
|
||||
|
||||
@@ -111,14 +112,20 @@ public partial class OverlayDialogHost
|
||||
SetToPosition(control);
|
||||
control.AddHandler(OverlayFeedbackElement.ClosedEvent, OnDialogControlClosing);
|
||||
control.AddHandler(DialogControlBase.LayerChangedEvent, OnDialogLayerChanged);
|
||||
// Notice: mask animation here is not really awaited, because currently dialogs appears immediately.
|
||||
if (!IsAnimationDisabled) MaskAppearAnimation.RunAsync(mask);
|
||||
|
||||
var element = control.GetVisualDescendants().OfType<InputElement>().FirstOrDefault(a => a.Focusable);
|
||||
var element = control.GetVisualDescendants().OfType<InputElement>()
|
||||
.FirstOrDefault(FocusHelper.GetDialogFocusHint);
|
||||
if (element is null)
|
||||
{
|
||||
element = control.GetVisualDescendants().OfType<InputElement>().FirstOrDefault(a => a.Focusable);
|
||||
}
|
||||
element?.Focus();
|
||||
_modalCount++;
|
||||
IsInModalStatus = _modalCount > 0;
|
||||
control.IsClosed = false;
|
||||
control.Focus();
|
||||
// control.Focus();
|
||||
}
|
||||
|
||||
// Handle dialog layer change event
|
||||
|
||||
@@ -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<InputElement>().FirstOrDefault(a => a.Focusable);
|
||||
|
||||
var element = control.GetVisualDescendants().OfType<InputElement>()
|
||||
.FirstOrDefault(FocusHelper.GetDialogFocusHint);
|
||||
if (element is null)
|
||||
{
|
||||
element = control.GetVisualDescendants().OfType<InputElement>().FirstOrDefault(a => a.Focusable);
|
||||
}
|
||||
element?.Focus();
|
||||
}
|
||||
|
||||
|
||||
13
src/Ursa/Helpers/FocusHelper.cs
Normal file
13
src/Ursa/Helpers/FocusHelper.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Input;
|
||||
|
||||
namespace Ursa.Helpers;
|
||||
|
||||
public class FocusHelper
|
||||
{
|
||||
public static readonly AttachedProperty<bool> DialogFocusHintProperty =
|
||||
AvaloniaProperty.RegisterAttached<FocusHelper, InputElement, bool>("DialogFocusHint");
|
||||
|
||||
public static void SetDialogFocusHint(InputElement obj, bool value) => obj.SetValue(DialogFocusHintProperty, value);
|
||||
public static bool GetDialogFocusHint(InputElement obj) => obj.GetValue(DialogFocusHintProperty);
|
||||
}
|
||||
Reference in New Issue
Block a user