2 * Copyright(c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 using System.Collections.Generic;
20 using System.ComponentModel;
21 using Tizen.NUI.BaseComponents;
22 using Tizen.NUI.Binding;
24 namespace Tizen.NUI.Components
27 /// PoppedEventArgs is a class to record <see cref="Navigator.Popped"/> event arguments which will be sent to user.
29 /// <since_tizen> 9 </since_tizen>
30 public class PoppedEventArgs : EventArgs
33 /// Page popped by Navigator.
35 /// <since_tizen> 9 </since_tizen>
36 public Page Page { get; internal set; }
40 /// The Navigator is a class which navigates pages with stack methods such as Push and Pop.
43 /// With Transition class, Navigator supports smooth transition of View pair between two Pages
44 /// by using <see cref="PushWithTransition(Page)"/> and <see cref="PopWithTransition()"/> methods.
45 /// If current top Page and next top Page have <see cref="View"/>s those have same TransitionTag,
46 /// Navigator creates smooth transition motion for them.
47 /// Navigator.Transition property can be used to set properties of the Transition such as TimePeriod and AlphaFunction.
48 /// When all transitions are finished, Navigator calls a callback methods those connected on the "TransitionFinished" event.
52 /// Navigator navigator = new Navigator()
54 /// TimePeriod = new TimePeriod(500),
55 /// AlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.EaseInOutSine)
58 /// View view = new View()
60 /// TransitionOptions = new TransitionOptions()
62 /// /* Set properties for the transition of this View */
66 /// ContentPage newPage = new ContentPage()
71 /// Navigator.PushWithTransition(newPage);
74 /// <since_tizen> 9 </since_tizen>
75 public class Navigator : Control
78 /// TransitionProperty
80 [EditorBrowsable(EditorBrowsableState.Never)]
81 public static readonly BindableProperty TransitionProperty = BindableProperty.Create(nameof(Transition), typeof(Transition), typeof(Navigator), null, propertyChanged: (bindable, oldValue, newValue) =>
83 var instance = (Navigator)bindable;
86 instance.InternalTransition = newValue as Transition;
89 defaultValueCreator: (bindable) =>
91 var instance = (Navigator)bindable;
92 return instance.InternalTransition;
95 private const int DefaultTransitionDuration = 500;
97 //This will be replaced with view transition class instance.
98 private Animation curAnimation = null;
100 //This will be replaced with view transition class instance.
101 private Animation newAnimation = null;
103 private TransitionSet transitionSet = null;
105 private Transition transition = new Transition()
107 TimePeriod = new TimePeriod(DefaultTransitionDuration),
108 AlphaFunction = new AlphaFunction(AlphaFunction.BuiltinFunctions.Default),
111 private bool transitionFinished = true;
113 //TODO: Needs to consider how to remove disposed window from dictionary.
114 //Two dictionaries are required to remove disposed navigator from dictionary.
115 private static Dictionary<Window, Navigator> windowNavigator = new Dictionary<Window, Navigator>();
116 private static Dictionary<Navigator, Window> navigatorWindow = new Dictionary<Navigator, Window>();
118 private List<Page> navigationPages = new List<Page>();
121 /// Creates a new instance of a Navigator.
123 /// <since_tizen> 9 </since_tizen>
124 public Navigator() : base()
126 Layout = new AbsoluteLayout();
130 [EditorBrowsable(EditorBrowsableState.Never)]
131 public override void OnInitialize()
135 AccessibilityRole = Role.PageTabList;
139 /// An event fired when Transition has been finished.
141 /// <since_tizen> 9 </since_tizen>
142 public event EventHandler<EventArgs> TransitionFinished;
145 /// An event fired when Pop of a page has been finished.
148 /// When you free resources in the Popped event handler, please make sure if the popped page is the page you find.
150 /// <since_tizen> 9 </since_tizen>
151 public event EventHandler<PoppedEventArgs> Popped;
154 /// Returns the count of pages in Navigator.
156 /// <since_tizen> 9 </since_tizen>
157 public int PageCount => navigationPages.Count;
160 /// Transition properties for the transition of View pair having same transition tag.
162 /// <since_tizen> 9 </since_tizen>
163 public Transition Transition
167 return GetValue(TransitionProperty) as Transition;
171 SetValue(TransitionProperty, value);
172 NotifyPropertyChanged();
175 private Transition InternalTransition
188 /// Pushes a page to Navigator.
189 /// If the page is already in Navigator, then it is not pushed.
191 /// <param name="page">The page to push to Navigator.</param>
192 /// <exception cref="ArgumentNullException">Thrown when the argument page is null.</exception>
193 /// <since_tizen> 9 </since_tizen>
194 public void PushWithTransition(Page page)
196 if (!transitionFinished)
198 Tizen.Log.Error("NUI", "Transition is still not finished.\n");
204 throw new ArgumentNullException(nameof(page), "page should not be null.");
207 //Duplicate page is not pushed.
208 if (navigationPages.Contains(page)) return;
210 var topPage = Peek();
218 navigationPages.Add(page);
220 page.Navigator = this;
223 page.InvokeAppearing();
224 topPage.InvokeDisappearing();
226 transitionSet = CreateTransitions(topPage, page, true);
227 transitionSet.Finished += (object sender, EventArgs e) =>
229 if (page is DialogPage == false)
231 topPage.SetVisible(false);
234 // Need to update Content of the new page
235 ShowContentOfPage(page);
238 page.InvokeAppeared();
239 topPage.InvokeDisappeared();
240 NotifyAccessibilityStatesChangeOfPages(topPage, page);
242 transitionFinished = false;
246 /// Pops the top page from Navigator.
248 /// <returns>The popped page.</returns>
249 /// <exception cref="InvalidOperationException">Thrown when there is no page in Navigator.</exception>
250 /// <since_tizen> 9 </since_tizen>
251 public Page PopWithTransition()
253 if (!transitionFinished)
255 Tizen.Log.Error("NUI", "Transition is still not finished.\n");
259 if (navigationPages.Count == 0)
261 throw new InvalidOperationException("There is no page in Navigator.");
264 var topPage = Peek();
266 if (navigationPages.Count == 1)
270 //Invoke Popped event
271 Popped?.Invoke(this, new PoppedEventArgs() { Page = topPage });
275 var newTopPage = navigationPages[navigationPages.Count - 2];
278 newTopPage.InvokeAppearing();
279 topPage.InvokeDisappearing();
281 transitionSet = CreateTransitions(topPage, newTopPage, false);
282 transitionSet.Finished += (object sender, EventArgs e) =>
285 topPage.SetVisible(true);
287 // Need to update Content of the new page
288 ShowContentOfPage(newTopPage);
291 newTopPage.InvokeAppeared();
292 topPage.InvokeDisappeared();
294 //Invoke Popped event
295 Popped?.Invoke(this, new PoppedEventArgs() { Page = topPage });
297 transitionFinished = false;
303 /// Pushes a page to Navigator.
304 /// If the page is already in Navigator, then it is not pushed.
306 /// <param name="page">The page to push to Navigator.</param>
307 /// <exception cref="ArgumentNullException">Thrown when the argument page is null.</exception>
308 /// <since_tizen> 9 </since_tizen>
309 public void Push(Page page)
311 if (!transitionFinished)
313 Tizen.Log.Error("NUI", "Transition is still not finished.\n");
319 throw new ArgumentNullException(nameof(page), "page should not be null.");
322 //Duplicate page is not pushed.
323 if (navigationPages.Contains(page)) return;
333 navigationPages.Add(page);
335 page.Navigator = this;
338 page.InvokeAppearing();
339 curTop.InvokeDisappearing();
341 curTop.SaveKeyFocus();
343 //TODO: The following transition codes will be replaced with view transition.
344 InitializeAnimation();
346 if (page is DialogPage == false)
348 curAnimation = new Animation(1000);
349 curAnimation.AnimateTo(curTop, "Opacity", 1.0f, 0, 1000);
350 curAnimation.EndAction = Animation.EndActions.StopFinal;
351 curAnimation.Finished += (object sender, EventArgs args) =>
353 curTop.SetVisible(false);
356 curTop.InvokeDisappeared();
361 page.SetVisible(true);
362 // Set Content visible because it was hidden by HideContentOfPage.
363 (page as ContentPage).Content?.SetVisible(true);
365 newAnimation = new Animation(1000);
366 newAnimation.AnimateTo(page, "Opacity", 1.0f, 0, 1000);
367 newAnimation.EndAction = Animation.EndActions.StopFinal;
368 newAnimation.Finished += (object sender, EventArgs e) =>
370 // Need to update Content of the new page
371 ShowContentOfPage(page);
374 page.InvokeAppeared();
375 NotifyAccessibilityStatesChangeOfPages(curTop, page);
377 page.RestoreKeyFocus();
383 ShowContentOfPage(page);
384 page.RestoreKeyFocus();
389 /// Pops the top page from Navigator.
391 /// <returns>The popped page.</returns>
392 /// <exception cref="InvalidOperationException">Thrown when there is no page in Navigator.</exception>
393 /// <since_tizen> 9 </since_tizen>
396 if (!transitionFinished)
398 Tizen.Log.Error("NUI", "Transition is still not finished.\n");
402 if (navigationPages.Count == 0)
404 throw new InvalidOperationException("There is no page in Navigator.");
409 if (navigationPages.Count == 1)
413 //Invoke Popped event
414 Popped?.Invoke(this, new PoppedEventArgs() { Page = curTop });
419 var newTop = navigationPages[navigationPages.Count - 2];
422 newTop.InvokeAppearing();
423 curTop.InvokeDisappearing();
424 curTop.SaveKeyFocus();
426 //TODO: The following transition codes will be replaced with view transition.
427 InitializeAnimation();
429 if (curTop is DialogPage == false)
431 curAnimation = new Animation(1000);
432 curAnimation.AnimateTo(curTop, "Opacity", 0.0f, 0, 1000);
433 curAnimation.EndAction = Animation.EndActions.StopFinal;
434 curAnimation.Finished += (object sender, EventArgs e) =>
436 //Removes the current top page after transition is finished.
438 curTop.Opacity = 1.0f;
441 curTop.InvokeDisappeared();
443 //Invoke Popped event
444 Popped?.Invoke(this, new PoppedEventArgs() { Page = curTop });
448 newTop.Opacity = 1.0f;
449 newTop.SetVisible(true);
450 // Set Content visible because it was hidden by HideContentOfPage.
451 (newTop as ContentPage).Content?.SetVisible(true);
453 newAnimation = new Animation(1000);
454 newAnimation.AnimateTo(newTop, "Opacity", 1.0f, 0, 1000);
455 newAnimation.EndAction = Animation.EndActions.StopFinal;
456 newAnimation.Finished += (object sender, EventArgs e) =>
458 // Need to update Content of the new page
459 ShowContentOfPage(newTop);
462 newTop.InvokeAppeared();
464 newTop.RestoreKeyFocus();
477 /// Returns the page of the given index in Navigator.
478 /// The indices of pages in Navigator are basically the order of pushing or inserting to Navigator.
479 /// So a page's index in Navigator can be changed whenever push/insert or pop/remove occurs.
481 /// <param name="index">The index of a page in Navigator.</param>
482 /// <returns>The page of the given index in Navigator.</returns>
483 /// <exception cref="ArgumentOutOfRangeException">Thrown when the argument index is less than 0, or greater than the number of pages.</exception>
484 public Page GetPage(int index)
486 if ((index < 0) || (index > navigationPages.Count))
488 throw new ArgumentOutOfRangeException(nameof(index), "index should be greater than or equal to 0, and less than or equal to the number of pages.");
491 return navigationPages[index];
495 /// Returns the current index of the given page in Navigator.
496 /// The indices of pages in Navigator are basically the order of pushing or inserting to Navigator.
497 /// So a page's index in Navigator can be changed whenever push/insert or pop/remove occurs.
499 /// <param name="page">The page in Navigator.</param>
500 /// <returns>The index of the given page in Navigator. If the given page is not in the Navigator, then -1 is returned.</returns>
501 /// <exception cref="ArgumentNullException">Thrown when the argument page is null.</exception>
502 /// <since_tizen> 9 </since_tizen>
503 public int IndexOf(Page page)
507 throw new ArgumentNullException(nameof(page), "page should not be null.");
510 for (int i = 0; i < navigationPages.Count; i++)
512 if (navigationPages[i] == page)
522 /// Inserts a page at the specified index of Navigator.
523 /// The indices of pages in Navigator are basically the order of pushing or inserting to Navigator.
524 /// So a page's index in Navigator can be changed whenever push/insert or pop/remove occurs.
525 /// To find the current index of a page in Navigator, please use IndexOf(page).
526 /// If the page is already in Navigator, then it is not inserted.
528 /// <param name="index">The index of a page in Navigator where the page will be inserted.</param>
529 /// <param name="page">The page to insert to Navigator.</param>
530 /// <exception cref="ArgumentOutOfRangeException">Thrown when the argument index is less than 0, or greater than the number of pages.</exception>
531 /// <exception cref="ArgumentNullException">Thrown when the argument page is null.</exception>
532 /// <since_tizen> 9 </since_tizen>
533 public void Insert(int index, Page page)
535 if ((index < 0) || (index > navigationPages.Count))
537 throw new ArgumentOutOfRangeException(nameof(index), "index should be greater than or equal to 0, and less than or equal to the number of pages.");
542 throw new ArgumentNullException(nameof(page), "page should not be null.");
545 //Duplicate page is not pushed.
546 if (navigationPages.Contains(page)) return;
548 //TODO: The following transition codes will be replaced with view transition.
549 InitializeAnimation();
551 ShowContentOfPage(page);
553 if (index == PageCount)
556 page.SetVisible(true);
560 page.SetVisible(false);
564 navigationPages.Insert(index, page);
566 page.Navigator = this;
567 if (index == PageCount - 1)
571 NotifyAccessibilityStatesChangeOfPages(navigationPages[PageCount - 2], page);
575 NotifyAccessibilityStatesChangeOfPages(null, page);
581 /// Inserts a page to Navigator before an existing page.
582 /// If the page is already in Navigator, then it is not inserted.
584 /// <param name="before">The existing page, before which a page will be inserted.</param>
585 /// <param name="page">The page to insert to Navigator.</param>
586 /// <exception cref="ArgumentNullException">Thrown when the argument before is null.</exception>
587 /// <exception cref="ArgumentNullException">Thrown when the argument page is null.</exception>
588 /// <exception cref="ArgumentException">Thrown when the argument before does not exist in Navigator.</exception>
589 /// <since_tizen> 9 </since_tizen>
590 public void InsertBefore(Page before, Page page)
594 throw new ArgumentNullException(nameof(before), "before should not be null.");
599 throw new ArgumentNullException(nameof(page), "page should not be null.");
602 //Find the index of before page.
603 int beforeIndex = navigationPages.FindIndex(x => x == before);
605 //before does not exist in Navigator.
606 if (beforeIndex == -1)
608 throw new ArgumentException("before does not exist in Navigator.", nameof(before));
611 Insert(beforeIndex, page);
615 /// Removes a page from Navigator.
617 /// <param name="page">The page to remove from Navigator.</param>
618 /// <exception cref="ArgumentNullException">Thrown when the argument page is null.</exception>
619 /// <since_tizen> 9 </since_tizen>
620 public void Remove(Page page)
624 throw new ArgumentNullException(nameof(page), "page should not be null.");
627 //TODO: The following transition codes will be replaced with view transition.
628 InitializeAnimation();
630 HideContentOfPage(page);
636 navigationPages[PageCount - 2].Opacity = 1.0f;
637 navigationPages[PageCount - 2].SetVisible(true);
638 NotifyAccessibilityStatesChangeOfPages(page, navigationPages[PageCount - 2]);
640 else if (PageCount == 1)
642 NotifyAccessibilityStatesChangeOfPages(page, null);
645 page.Navigator = null;
646 navigationPages.Remove(page);
651 /// Removes a page at the specified index of Navigator.
652 /// The indices of pages in Navigator are basically the order of pushing or inserting to Navigator.
653 /// So a page's index in Navigator can be changed whenever push/insert or pop/remove occurs.
654 /// To find the current index of a page in Navigator, please use IndexOf(page).
656 /// <param name="index">The index of a page in Navigator where the page will be removed.</param>
657 /// <exception cref="ArgumentOutOfRangeException">Thrown when the index is less than 0, or greater than or equal to the number of pages.</exception>
658 /// <since_tizen> 9 </since_tizen>
659 public void RemoveAt(int index)
661 if ((index < 0) || (index >= navigationPages.Count))
663 throw new ArgumentOutOfRangeException(nameof(index), "index should be greater than or equal to 0, and less than the number of pages.");
666 Remove(navigationPages[index]);
670 /// Returns the page at the top of Navigator.
672 /// <returns>The page at the top of Navigator.</returns>
673 /// <since_tizen> 9 </since_tizen>
676 if (navigationPages.Count == 0) return null;
678 return navigationPages[navigationPages.Count - 1];
682 /// Disposes Navigator and all children on it.
684 /// <param name="type">Dispose type.</param>
685 [EditorBrowsable(EditorBrowsableState.Never)]
686 protected override void Dispose(DisposeTypes type)
693 if (type == DisposeTypes.Explicit)
695 foreach (Page page in navigationPages)
697 Utility.Dispose(page);
699 navigationPages.Clear();
703 if (navigatorWindow.TryGetValue(this, out window) == true)
705 navigatorWindow.Remove(this);
706 windowNavigator.Remove(window);
714 /// Returns the default navigator of the given window.
716 /// <returns>The default navigator of the given window.</returns>
717 /// <exception cref="ArgumentNullException">Thrown when the argument window is null.</exception>
718 /// <since_tizen> 9 </since_tizen>
719 public static Navigator GetDefaultNavigator(Window window)
723 throw new ArgumentNullException(nameof(window), "window should not be null.");
726 if (windowNavigator.ContainsKey(window) == true)
728 return windowNavigator[window];
731 var defaultNavigator = new Navigator();
732 defaultNavigator.WidthResizePolicy = ResizePolicyType.FillToParent;
733 defaultNavigator.HeightResizePolicy = ResizePolicyType.FillToParent;
734 window.Add(defaultNavigator);
735 windowNavigator.Add(window, defaultNavigator);
736 navigatorWindow.Add(defaultNavigator, window);
738 return defaultNavigator;
742 /// Create Transitions between currentTopPage and newTopPage
744 /// <param name="currentTopPage">The top page of Navigator.</param>
745 /// <param name="newTopPage">The new top page after transition.</param>
746 /// <param name="pushTransition">True if this transition is for push new page</param>
747 private TransitionSet CreateTransitions(Page currentTopPage, Page newTopPage, bool pushTransition)
749 currentTopPage.SetVisible(true);
750 // Set Content visible because it was hidden by HideContentOfPage.
751 (currentTopPage as ContentPage).Content?.SetVisible(true);
753 newTopPage.SetVisible(true);
754 // Set Content visible because it was hidden by HideContentOfPage.
755 (newTopPage as ContentPage).Content?.SetVisible(true);
757 List<View> taggedViewsInNewTopPage = new List<View>();
758 RetrieveTaggedViews(taggedViewsInNewTopPage, newTopPage, true);
759 List<View> taggedViewsInCurrentTopPage = new List<View>();
760 RetrieveTaggedViews(taggedViewsInCurrentTopPage, currentTopPage, true);
762 List<KeyValuePair<View, View>> sameTaggedViewPair = new List<KeyValuePair<View, View>>();
763 foreach (View currentTopPageView in taggedViewsInCurrentTopPage)
765 bool findPair = false;
766 foreach (View newTopPageView in taggedViewsInNewTopPage)
768 if ((currentTopPageView.TransitionOptions != null) && (newTopPageView.TransitionOptions != null) &&
769 currentTopPageView.TransitionOptions?.TransitionTag == newTopPageView.TransitionOptions?.TransitionTag)
771 sameTaggedViewPair.Add(new KeyValuePair<View, View>(currentTopPageView, newTopPageView));
778 taggedViewsInNewTopPage.Remove(sameTaggedViewPair[sameTaggedViewPair.Count - 1].Value);
781 foreach (KeyValuePair<View, View> pair in sameTaggedViewPair)
783 taggedViewsInCurrentTopPage.Remove(pair.Key);
786 TransitionSet newTransitionSet = new TransitionSet();
787 foreach (KeyValuePair<View, View> pair in sameTaggedViewPair)
789 TransitionItem pairTransition = transition.CreateTransition(pair.Key, pair.Value, pushTransition);
790 if (pair.Value.TransitionOptions?.TransitionWithChild ?? false)
792 pairTransition.TransitionWithChild = true;
794 newTransitionSet.AddTransition(pairTransition);
797 newTransitionSet.Finished += (object sender, EventArgs e) =>
799 if (newTopPage.Layout != null)
801 newTopPage.Layout.RequestLayout();
803 if (currentTopPage.Layout != null)
805 currentTopPage.Layout.RequestLayout();
807 transitionFinished = true;
808 InvokeTransitionFinished();
809 transitionSet.Dispose();
810 currentTopPage.Opacity = 1.0f;
813 if (!pushTransition || newTopPage is DialogPage == false)
815 View transitionView = (currentTopPage is ContentPage) ? (currentTopPage as ContentPage).Content : (currentTopPage as DialogPage).Content;
816 if (currentTopPage.DisappearingTransition != null && transitionView != null)
818 TransitionItemBase disappearingTransition = currentTopPage.DisappearingTransition.CreateTransition(transitionView, false);
819 disappearingTransition.TransitionWithChild = true;
820 newTransitionSet.AddTransition(disappearingTransition);
824 currentTopPage.SetVisible(false);
827 if (pushTransition || currentTopPage is DialogPage == false)
829 View transitionView = (newTopPage is ContentPage) ? (newTopPage as ContentPage).Content : (newTopPage as DialogPage).Content;
830 if (newTopPage.AppearingTransition != null && transitionView != null)
832 TransitionItemBase appearingTransition = newTopPage.AppearingTransition.CreateTransition(transitionView, true);
833 appearingTransition.TransitionWithChild = true;
834 newTransitionSet.AddTransition(appearingTransition);
838 newTransitionSet.Play();
840 return newTransitionSet;
844 /// Retrieve Tagged Views in the view tree.
846 /// <param name="taggedViews">Returned tagged view list..</param>
847 /// <param name="view">Root View to get tagged child View.</param>
848 /// <param name="isRoot">Flag to check current View is page or not</param>
849 private void RetrieveTaggedViews(List<View> taggedViews, View view, bool isRoot)
851 if (!isRoot && view.TransitionOptions != null)
853 if (!string.IsNullOrEmpty(view.TransitionOptions?.TransitionTag))
855 taggedViews.Add((view as View));
856 if (view.TransitionOptions.TransitionWithChild)
864 foreach (View child in view.Children)
866 RetrieveTaggedViews(taggedViews, child, false);
871 /// Notify accessibility states change of pages.
873 /// <param name="disappearedPage">Disappeared page</param>
874 /// <param name="appearedPage">Appeared page</param>
875 private void NotifyAccessibilityStatesChangeOfPages(Page disappearedPage, Page appearedPage)
877 if (disappearedPage != null)
879 disappearedPage.UnregisterDefaultLabel();
880 //We can call disappearedPage.NotifyAccessibilityStatesChange
881 //To reduce accessibility events, we are using currently highlighted view instead
882 View curHighlightedView = Accessibility.Accessibility.GetCurrentlyHighlightedView();
883 if (curHighlightedView != null)
885 curHighlightedView.NotifyAccessibilityStatesChange(new AccessibilityStates(AccessibilityState.Visible, AccessibilityState.Showing), AccessibilityStatesNotifyMode.Single);
889 if (appearedPage != null)
891 appearedPage.RegisterDefaultLabel();
892 appearedPage.NotifyAccessibilityStatesChange(new AccessibilityStates(AccessibilityState.Visible, AccessibilityState.Showing), AccessibilityStatesNotifyMode.Single);
896 internal void InvokeTransitionFinished()
898 TransitionFinished?.Invoke(this, new EventArgs());
901 //TODO: The following transition codes will be replaced with view transition.
902 private void InitializeAnimation()
904 if (curAnimation != null)
907 curAnimation.Clear();
911 if (newAnimation != null)
914 newAnimation.Clear();
919 // Show and Register Content of Page to Accessibility bridge
920 private void ShowContentOfPage(Page page)
922 View content = (page is DialogPage) ? (page as DialogPage)?.Content : (page as ContentPage)?.Content;
925 content.Show(); // Calls RegisterDefaultLabel()
929 // Hide and Remove Content of Page from Accessibility bridge
930 private void HideContentOfPage(Page page)
932 View content = (page is DialogPage) ? (page as DialogPage)?.Content : (page as ContentPage)?.Content;
935 content.Hide(); // Calls UnregisterDefaultLabel()