Skip to content

Commit

Permalink
make navview clickable after moved in the tree (#249)
Browse files Browse the repository at this point in the history
  • Loading branch information
licanhua authored Jan 31, 2019
1 parent b2be822 commit 01172d7
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 5 deletions.
22 changes: 18 additions & 4 deletions dev/NavigationView/NavigationView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ NavigationView::NavigationView()
});

Unloaded({ this, &NavigationView::OnUnloaded });
Loaded({ this, &NavigationView::OnLoaded });
}

void NavigationView::OnApplyTemplate()
Expand Down Expand Up @@ -242,7 +243,7 @@ void NavigationView::OnApplyTemplate()
{
m_leftNavListView.set(leftNavListView);

m_leftNavListViewLoadedRevoker = leftNavListView.Loaded(winrt::auto_revoke, { this, &NavigationView::OnLoaded });
m_leftNavListViewLoadedRevoker = leftNavListView.Loaded(winrt::auto_revoke, { this, &NavigationView::OnListViewLoaded });

m_leftNavListViewSelectionChangedRevoker = leftNavListView.SelectionChanged(winrt::auto_revoke, { this, &NavigationView::OnSelectionChanged });
m_leftNavListViewItemClickRevoker = leftNavListView.ItemClick(winrt::auto_revoke, { this, &NavigationView::OnItemClick });
Expand All @@ -255,7 +256,7 @@ void NavigationView::OnApplyTemplate()
{
m_topNavListView.set(topNavListView);

m_topNavListViewLoadedRevoker = topNavListView.Loaded(winrt::auto_revoke, { this, &NavigationView::OnLoaded });
m_topNavListViewLoadedRevoker = topNavListView.Loaded(winrt::auto_revoke, { this, &NavigationView::OnListViewLoaded });

m_topNavListViewSelectionChangedRevoker = topNavListView.SelectionChanged(winrt::auto_revoke, { this, &NavigationView::OnSelectionChanged });
m_topNavListViewItemClickRevoker = topNavListView.ItemClick(winrt::auto_revoke, { this, &NavigationView::OnItemClick });
Expand Down Expand Up @@ -2683,7 +2684,7 @@ void NavigationView::OnPropertyChanged(const winrt::DependencyPropertyChangedEve
}


void NavigationView::OnLoaded(winrt::IInspectable const& sender, winrt::RoutedEventArgs const& args)
void NavigationView::OnListViewLoaded(winrt::IInspectable const& sender, winrt::RoutedEventArgs const& args)
{
if (auto item = SelectedItem())
{
Expand All @@ -2706,9 +2707,22 @@ void NavigationView::OnLoaded(winrt::IInspectable const& sender, winrt::RoutedEv
}
}

// If app is .net app, the lifetime of NavigationView maybe depends on garbage collection.
// Unlike other revoker, TitleBar is in global space and we need to stop receiving changed event when it's unloaded.
// So we do hook it in Loaded and Unhook it in Unloaded
void NavigationView::OnUnloaded(winrt::IInspectable const& sender, winrt::RoutedEventArgs const& args)
{
UnhookEventsAndClearFields();
m_titleBarMetricsChangedRevoker.revoke();
m_titleBarIsVisibleChangedRevoker.revoke();
}

void NavigationView::OnLoaded(winrt::IInspectable const& sender, winrt::RoutedEventArgs const& args)
{
if (auto coreTitleBar = m_coreTitleBar.get())
{
m_titleBarMetricsChangedRevoker = coreTitleBar.LayoutMetricsChanged(winrt::auto_revoke, { this, &NavigationView::OnTitleBarMetricsChanged });
m_titleBarIsVisibleChangedRevoker = coreTitleBar.IsVisibleChanged(winrt::auto_revoke, { this, &NavigationView::OnTitleBarIsVisibleChanged });
}
}

void NavigationView::OnIsPaneOpenChanged()
Expand Down
3 changes: 2 additions & 1 deletion dev/NavigationView/NavigationView.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,9 @@ class NavigationView :
winrt::DependencyObject ContainerFromMenuItem(winrt::IInspectable const& item);

void OnPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
void OnLoaded(winrt::IInspectable const& sender, winrt::RoutedEventArgs const& args);
void OnListViewLoaded(winrt::IInspectable const& sender, winrt::RoutedEventArgs const& args);
void OnUnloaded(winrt::IInspectable const& sender, winrt::RoutedEventArgs const& args);
void OnLoaded(winrt::IInspectable const& sender, winrt::RoutedEventArgs const& args);

void OnSettingsInvoked();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,37 @@ public void ItemSourceTest()
}
}

[TestMethod]
[TestProperty("NavViewTestSuite", "A")]
public void VerifyNavigationViewItemResponseToClickAfterBeingMovedBetweenFrames()
{
using (IDisposable page1 = new TestSetupHelper("NavigationView Tests"),
page2 = new TestSetupHelper("NavigationView Init Test"))
{
var myLocationButton = FindElement.ByName<Button>("MyLocation");
var switchFrameButton = FindElement.ByName<Button>("SwitchFrame");
var result = new TextBlock(FindElement.ByName("MyLocationResult"));

Log.Comment("Click on MyLocation Item and verify it's on Frame1");
myLocationButton.Invoke();
Wait.ForIdle();
Verify.AreEqual(result.GetText(), "Frame1");

Log.Comment("Click on SwitchFrame");
switchFrameButton.Invoke();
Wait.ForIdle();

// tree structure changed and rebuild the cache.
ElementCache.Clear();

Log.Comment("Click on MyLocation Item and verify it's on Frame2");
myLocationButton = FindElement.ByName<Button>("MyLocation");
myLocationButton.Invoke();
Wait.ForIdle();
Verify.AreEqual(result.GetText(), "Frame2");
}
}

[TestMethod]
[TestProperty("NavViewTestSuite", "A")]
public void ForceIsPaneOpenToFalseOnLeftNavTest()
Expand Down
16 changes: 16 additions & 0 deletions dev/NavigationView/TestUI/NavigationViewInitPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,22 @@
<Button x:Name="RemoveItemButton" AutomationProperties.Name="RemoveItemButton" Content="Remove Item" Click="RemoveButton_Click"/>
<Button x:Name="ChangeToIEnumerableButton" AutomationProperties.Name="ChangeToIEnumerableButton" Content="Make it IEnumerable" Click="ChangeToIEnumerableButton_Clicks"/>
<Button x:Name="FlipOrientation" AutomationProperties.Name="FlipOrientationButton" Content="Flip Orientation" Click="FlipOrientation_Click"/>

<StackPanel>
<Button x:Name="SwitchFrame" AutomationProperties.Name="SwitchFrame" Content="SwitchFrame" Click="SwitchFrame_Click" />
<TextBlock x:Name="MyLocationResult" AutomationProperties.Name="MyLocationResult" Text="Unknown"/>

<StackPanel Orientation="Horizontal">
<Frame x:Name="Frame1" Width="200" Height="200">
<controls:NavigationView x:Name="NavView2" IsBackButtonVisible="Collapsed" IsSettingsVisible="False" PaneDisplayMode="Top" ItemInvoked="NavView2_ItemInvoked">
<controls:NavigationView.MenuItems>
<controls:NavigationViewItem Icon="Accept" Content="MyLocation" AutomationProperties.Name="MyLocation" />
</controls:NavigationView.MenuItems>
</controls:NavigationView>
</Frame>
<Frame x:Name="Frame2" Width="200" Height="200"/>
</StackPanel>
</StackPanel>
</StackPanel>
</controls:NavigationView>
</Grid>
Expand Down
30 changes: 30 additions & 0 deletions dev/NavigationView/TestUI/NavigationViewInitPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
#if !BUILD_WINDOWS
using NavigationViewPaneDisplayMode = Microsoft.UI.Xaml.Controls.NavigationViewPaneDisplayMode;
using MaterialHelperTestApi = Microsoft.UI.Private.Media.MaterialHelperTestApi;
using NavigationView = Microsoft.UI.Xaml.Controls.NavigationView;
using NavigationViewItemInvokedEventArgs = Microsoft.UI.Xaml.Controls.NavigationViewItemInvokedEventArgs;
#endif

namespace MUXControlsTestApp
Expand Down Expand Up @@ -86,5 +88,33 @@ private void FlipOrientation_Click(object sender, RoutedEventArgs e)
{
NavView.PaneDisplayMode = NavView.PaneDisplayMode == NavigationViewPaneDisplayMode.Top ? NavigationViewPaneDisplayMode.Auto : NavigationViewPaneDisplayMode.Top;
}

private void SwitchFrame_Click(object sender, RoutedEventArgs e)
{
if (Frame2.Content == null)
{
var content = Frame1.Content;
Frame1.Content = null;
Frame2.Content = content;
}
else
{
var content = Frame2.Content;
Frame2.Content = null;
Frame1.Content = content;
}
}

private void NavView2_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
{
if (Frame2.Content == null)
{
MyLocationResult.Text = "Frame1";
}
else
{
MyLocationResult.Text = "Frame2";
}
}
}
}

0 comments on commit 01172d7

Please sign in to comment.