提交 4a4d848f 编写于 作者: M Martin Zikmund

fix: Use explicit XamlRoot for GetFocusedElement where possible

上级 7a1e9fbf
......@@ -504,7 +504,9 @@ public partial class BreadcrumbBar : Control
{
if (m_itemsRepeater is { } itemsRepeater)
{
var focusedElem = FocusManager.GetFocusedElement();
var focusedElem = XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot);
if (focusedElem is UIElement focusedElement)
{
......
......@@ -509,7 +509,7 @@ namespace Microsoft.UI.Xaml.Controls
var repeater = m_repeater;
if (repeater != null)
{
var focusedElement = FocusManager.GetFocusedElement() as UIElement;
var focusedElement = FocusManager.GetFocusedElement(XamlRoot) as UIElement;
if (focusedElement != null)
{
var focusedIndex = repeater.GetElementIndex(focusedElement);
......
......@@ -910,7 +910,10 @@ namespace Microsoft.UI.Xaml.Controls
{
UIElement focusedElement = null;
if (FocusManager.GetFocusedElement() is DependencyObject child)
var focusedObject = m_owner?.XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(m_owner.XamlRoot);
if (focusedObject is DependencyObject child)
{
var parent = CachedVisualTreeHelpers.GetParent(child);
var owner = (UIElement)m_owner;
......
......@@ -280,7 +280,10 @@ namespace Windows.UI.Xaml.Controls
{
// Re-focus the currently focused item to propagate focusState (the item might be focused
// under a different FocusState value).
spItemToFocus = FocusManager.GetFocusedElement() as DependencyObject;
var focusedElement = XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot);
spItemToFocus = focusedElement as DependencyObject;
}
else
{
......
......@@ -711,7 +711,9 @@ namespace Windows.UI.Xaml.Controls
}
// Only handle the up/down keys when focus is on the more/expand button.
var focusedElement = FocusManager.GetFocusedElement();
var focusedElement = XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot);
if (m_tpExpandButton == focusedElement)
{
bool isOpen = IsOpen;
......@@ -756,7 +758,9 @@ namespace Windows.UI.Xaml.Controls
private void ShiftFocusVerticallyInOverflow(bool topToBottom, bool allowFocusWrap = true)
{
var focusedElement = FocusManager.GetFocusedElement();
var focusedElement = XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot);
DependencyObject? referenceElement = null;
if (topToBottom)
......@@ -808,7 +812,9 @@ namespace Windows.UI.Xaml.Controls
// focus is currently on the first/last item depending on direction.
if (!shouldFocusLeaveOverflow)
{
var focusedElement = FocusManager.GetFocusedElement();
var focusedElement = XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot);
DependencyObject? referenceElement = null;
if (isShiftKeyPressed)
......@@ -1033,13 +1039,14 @@ namespace Windows.UI.Xaml.Controls
return result;
}
private void ShiftFocusHorizontally(bool moveToRight)
{
// Determine whether we should shift focus horizontally.
if (m_tpContentControl is { })
{
var focusedElement = FocusManager.GetFocusedElement();
var focusedElement = XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot);
// Don't do it if focus is in the custom content area.
var isChildOfContentControl = m_tpContentControl.IsAncestorOf(focusedElement as DependencyObject);
......
......@@ -90,7 +90,10 @@ namespace Windows.UI.Xaml.Controls
return false;
}
var focusedContainer = FocusManager.GetFocusedElement() as SelectorItem;
var focusedElement = XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot);
var focusedContainer = focusedElement as SelectorItem;
if (args.Key == VirtualKey.Enter ||
args.Key == VirtualKey.Space)
......@@ -150,7 +153,10 @@ namespace Windows.UI.Xaml.Controls
private int GetFocusedItemIndex()
{
var focusedItem = FocusManager.GetFocusedElement() as SelectorItem;
var focusedElement = XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot);
var focusedItem = focusedElement as SelectorItem;
if (focusedItem != null)
{
return IndexFromContainer(focusedItem);
......
......@@ -802,7 +802,9 @@ namespace Windows.UI.Xaml.Controls
{
// A child element got focus, so make sure we keep m_iFocusedIndex in sync
// with it.
var focusedElement = FocusManager.GetFocusedElement() as DependencyObject;
var focusedElement = (XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot)) as DependencyObject;
// Since GotFocus is an async event, the focused element could be null if we got it
// after the popup closes, which clears focus.
......@@ -823,7 +825,9 @@ namespace Windows.UI.Xaml.Controls
{
if (m_iFocusedIndex == -1)
{
var focusedElement = FocusManager.GetFocusedElement();
var focusedElement = XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot);
if (this != focusedElement)
{
......
......@@ -86,7 +86,7 @@ public partial class Popup
{
#if !HAS_UNO_WINUI
// In UWP, XamlRoot is set automatically to CoreWindow XamlRoot if not set beforehand.
if (XamlRoot is null && Child?.XamlRoot is null)
if (XamlRoot is null && Child?.XamlRoot is null && CoreServices.Instance.InitializationType != InitializationType.IslandsOnly)
{
XamlRoot = CoreServices.Instance.ContentRootCoordinator.CoreWindowContentRoot.XamlRoot;
}
......
......@@ -152,7 +152,7 @@ namespace Uno.UI.Xaml.Core
}
#endif
internal static void ProcessPointerUp(PointerRoutedEventArgs args, bool isAfterHandledUp = false)
internal void ProcessPointerUp(PointerRoutedEventArgs args, bool isAfterHandledUp = false)
{
// We don't want handled events raised on RootVisual,
// instead we wait for the element that handled it to directly forward it to us,
......@@ -183,11 +183,14 @@ namespace Uno.UI.Xaml.Core
// Uno specific: To ensure focus is properly lost when clicking "outside" app's content,
// we set focus here. In case UWP, focus is set to the root ScrollViewer instead,
// but Uno does not have it on all targets yet.
var focusedElement = XamlRoot is null ?
FocusManager.GetFocusedElement() :
FocusManager.GetFocusedElement(XamlRoot);
if (!isHandled // so isAfterHandledUp is false!
&& _canUnFocusOnNextLeftPointerRelease
&& args.GetCurrentPoint(null).Properties.PointerUpdateKind is PointerUpdateKind.LeftButtonReleased
&& !PointerCapture.TryGet(args.Pointer, out _)
&& FocusManager.GetFocusedElement() is UIElement uiElement)
&& focusedElement is UIElement uiElement)
{
uiElement.Unfocus();
args.Handled = true;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册