Skip to content

Commit 1c8aaf9

Browse files
Kunal22shahkazo0
andauthored
fix: navBar initialization-Android & iOS (#1275)
Co-authored-by: Steve Bilogan <[email protected]>
1 parent 1fd7607 commit 1c8aaf9

File tree

3 files changed

+75
-39
lines changed

3 files changed

+75
-39
lines changed

src/Uno.Toolkit.UI/Controls/NavigationBar/NativeNavigationBarPresenter.Android.cs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,12 @@
2626

2727
namespace Uno.Toolkit.UI
2828
{
29-
public partial class NativeNavigationBarPresenter : ContentPresenter, INavigationBarPresenter
29+
public partial class NativeNavigationBarPresenter
3030
{
3131
private SerialDisposable _mainCommandClickHandler = new SerialDisposable();
3232

3333
public NativeNavigationBarPresenter()
3434
{
35-
Loaded += OnLoaded;
3635
Unloaded += OnUnloaded;
3736
}
3837

@@ -41,29 +40,24 @@ private void OnUnloaded(object sender, RoutedEventArgs e)
4140
_mainCommandClickHandler.Disposable = null;
4241
}
4342

44-
public void SetOwner(NavigationBar navigationBar)
43+
private void OnMainCommandClicked(object sender, RoutedEventArgs e)
4544
{
46-
//Owner is accessed through TemplatedParent on Uno platforms
45+
var navBar = GetNavBar();
46+
navBar?.TryPerformMainCommand();
4747
}
4848

49-
private void OnLoaded(object sender, RoutedEventArgs e)
49+
partial void OnOwnerChanged()
5050
{
51-
var navBar = TemplatedParent as NavigationBar;
52-
if (navBar is { })
51+
_mainCommandClickHandler.Disposable = null;
52+
53+
if (GetNavBar() is { } navBar)
5354
{
5455
Content = navBar.GetOrAddDefaultRenderer().Native;
5556
ContentTemplate = null; // normally, the ContentTemplate is inherited from the NavigationBar, but in this case, we don't want it to. We want to use the renderer directly as the child.
5657
navBar.MainCommand.Click += OnMainCommandClicked;
57-
_mainCommandClickHandler.Disposable = null;
5858
_mainCommandClickHandler.Disposable = Disposable.Create(() => navBar.MainCommand.Click -= OnMainCommandClicked);
5959
}
6060
}
61-
62-
private void OnMainCommandClicked(object sender, RoutedEventArgs e)
63-
{
64-
var navBar = TemplatedParent as NavigationBar;
65-
navBar?.TryPerformMainCommand();
66-
}
6761
}
6862
}
6963
#endif
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#if __ANDROID__ || __IOS__
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
using Uno.Disposables;
8+
9+
#if IS_WINUI
10+
using Microsoft.UI.Xaml;
11+
using Microsoft.UI.Xaml.Controls;
12+
using Microsoft.UI.Xaml.Controls.Primitives;
13+
using Microsoft.UI.Xaml.Data;
14+
using Microsoft.UI.Xaml.Input;
15+
using Microsoft.UI.Xaml.Media;
16+
using Microsoft.UI.Xaml.Navigation;
17+
#else
18+
using Windows.UI.Xaml;
19+
using Windows.UI.Xaml.Controls;
20+
using Windows.UI.Xaml.Media;
21+
using Windows.UI.Xaml.Navigation;
22+
#endif
23+
24+
namespace Uno.Toolkit.UI
25+
{
26+
partial class NativeNavigationBarPresenter : ContentPresenter, INavigationBarPresenter
27+
{
28+
private WeakReference<NavigationBar?>? _weakNavBar;
29+
30+
public void SetOwner(NavigationBar? navigationBar)
31+
{
32+
if (GetNavBar() == navigationBar)
33+
{
34+
return;
35+
}
36+
_weakNavBar = new WeakReference<NavigationBar?>(navigationBar);
37+
38+
OnOwnerChanged();
39+
}
40+
41+
private NavigationBar? GetNavBar()
42+
{
43+
if (_weakNavBar == null)
44+
{
45+
return null;
46+
}
47+
48+
NavigationBar? targetNavBar = null;
49+
if (_weakNavBar.TryGetTarget(out targetNavBar))
50+
{
51+
return targetNavBar;
52+
}
53+
54+
return null;
55+
}
56+
57+
partial void OnOwnerChanged();
58+
}
59+
}
60+
#endif

src/Uno.Toolkit.UI/Controls/NavigationBar/NativeNavigationBarPresenter.iOS.cs

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,51 +31,36 @@
3131

3232
namespace Uno.Toolkit.UI
3333
{
34-
public partial class NativeNavigationBarPresenter : ContentPresenter, INavigationBarPresenter
34+
public partial class NativeNavigationBarPresenter
3535
{
3636
private readonly SerialDisposable _statusBarSubscription = new SerialDisposable();
3737
private readonly SerialDisposable _orientationSubscription = new SerialDisposable();
3838
private SerialDisposable _mainCommandClickHandler = new SerialDisposable();
39-
private WeakReference<NavigationBar?>? _navBarRef;
4039

4140
private readonly bool _isPhone = UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone;
4241

4342
public NativeNavigationBarPresenter()
4443
{
45-
Loaded += OnLoaded;
4644
Unloaded += OnUnloaded;
4745
}
4846

49-
public void SetOwner(NavigationBar navigationBar)
50-
{
51-
//Owner is accessed through TemplatedParent on Uno platforms
52-
}
53-
5447
private void OnUnloaded(object sender, RoutedEventArgs e)
5548
{
5649
_statusBarSubscription.Disposable = null;
5750
_orientationSubscription.Disposable = null;
5851
_mainCommandClickHandler.Disposable = null;
5952
}
6053

61-
private void OnLoaded(object sender, RoutedEventArgs e)
54+
partial void OnOwnerChanged()
6255
{
6356
// TODO: Find a proper way to decide whether a NavigationBar exists on canvas (within Page), or is mapped to the UINavigationController's NavigationBar.
6457

65-
NavigationBar? navBar = null;
66-
67-
_navBarRef?.TryGetTarget(out navBar);
68-
69-
if (navBar == null)
70-
{
71-
navBar = TemplatedParent as NavigationBar;
72-
_navBarRef = new WeakReference<NavigationBar?>(navBar);
73-
}
58+
_mainCommandClickHandler.Disposable = null;
7459

75-
if (navBar is { })
60+
if (GetNavBar() is { } navBar)
7661
{
7762
navBar.MainCommand.Click += OnMainCommandClick;
78-
_mainCommandClickHandler.Disposable = null;
63+
7964
_mainCommandClickHandler.Disposable = Disposable.Create(() => navBar.MainCommand.Click -= OnMainCommandClick);
8065

8166
LayoutNativeNavBar(navBar);
@@ -122,11 +107,8 @@ void OnStatusBarChanged(XamlStatusBar sender, object args)
122107

123108
private void OnMainCommandClick(object sender, RoutedEventArgs e)
124109
{
125-
NavigationBar? navBar = null;
126-
if (_navBarRef?.TryGetTarget(out navBar) ?? false)
127-
{
128-
navBar?.TryPerformMainCommand();
129-
}
110+
var navBar = GetNavBar();
111+
navBar?.TryPerformMainCommand();
130112
}
131113

132114
protected override Size MeasureOverride(Size size)

0 commit comments

Comments
 (0)