Skip to content

Commit

Permalink
Fix to TabView layout cycle issue that Terminal was experiencing. (#1703
Browse files Browse the repository at this point in the history
)
  • Loading branch information
teaP authored Dec 3, 2019
1 parent 2237b09 commit 9d841f3
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 2 deletions.
25 changes: 23 additions & 2 deletions dev/TabView/TabView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,16 @@ void TabView::OnListViewLoaded(const winrt::IInspectable&, const winrt::RoutedEv
SelectedIndex(listView.SelectedIndex());
SelectedItem(listView.SelectedItem());

// Find TabsItemsPresenter and listen for SizeChanged
m_itemsPresenter.set([this, listView]() {
auto itemsPresenter = SharedHelpers::FindInVisualTreeByName(listView, L"TabsItemsPresenter").as<winrt::ItemsPresenter>();
if (itemsPresenter)
{
m_itemsPresenterSizeChangedRevoker = itemsPresenter.SizeChanged(winrt::auto_revoke, { this, &TabView::OnItemsPresenterSizeChanged });
}
return itemsPresenter;
}());

auto scrollViewer = SharedHelpers::FindInVisualTreeByName(listView, L"ScrollViewer").as<winrt::FxScrollViewer>();
m_scrollViewer.set(scrollViewer);
if (scrollViewer)
Expand Down Expand Up @@ -306,6 +316,11 @@ void TabView::OnSizeChanged(const winrt::IInspectable&, const winrt::SizeChanged
UpdateTabWidths();
}

void TabView::OnItemsPresenterSizeChanged(const winrt::IInspectable& sender, const winrt::SizeChangedEventArgs& args)
{
UpdateTabWidths();
}

void TabView::OnItemsChanged(winrt::IInspectable const& item)
{
if (auto args = item.as<winrt::IVectorChangedEventArgs>())
Expand Down Expand Up @@ -564,7 +579,14 @@ void TabView::UpdateTabWidths()
if (auto listview = m_listView.get())
{
listview.MaxWidth(availableWidth);
winrt::FxScrollViewer::SetHorizontalScrollBarVisibility(listview, winrt::Windows::UI::Xaml::Controls::ScrollBarVisibility::Auto);

// Calculate if the scroll buttons should be visible.
if (auto itemsPresenter = m_itemsPresenter.get())
{
winrt::FxScrollViewer::SetHorizontalScrollBarVisibility(listview, itemsPresenter.ActualWidth() > availableWidth
? winrt::Windows::UI::Xaml::Controls::ScrollBarVisibility::Visible
: winrt::Windows::UI::Xaml::Controls::ScrollBarVisibility::Hidden);
}
}
}
else if (TabWidthMode() == winrt::TabViewWidthMode::Equal)
Expand Down Expand Up @@ -618,7 +640,6 @@ void TabView::UpdateTabWidths()
}
}


void TabView::UpdateSelectedItem()
{
if (auto listView = m_listView.get())
Expand Down
4 changes: 4 additions & 0 deletions dev/TabView/TabView.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ class TabView :
void OnScrollDecreaseClick(const winrt::IInspectable& sender, const winrt::RoutedEventArgs& args);
void OnScrollIncreaseClick(const winrt::IInspectable& sender, const winrt::RoutedEventArgs& args);
void OnSizeChanged(const winrt::IInspectable& sender, const winrt::SizeChangedEventArgs& args);
void OnItemsPresenterSizeChanged(const winrt::IInspectable& sender, const winrt::SizeChangedEventArgs& args);

void OnListViewLoaded(const winrt::IInspectable& sender, const winrt::RoutedEventArgs& args);
void OnListViewSelectionChanged(const winrt::IInspectable& sender, const winrt::SelectionChangedEventArgs& args);
Expand Down Expand Up @@ -159,6 +160,7 @@ class TabView :
tracker_ref<winrt::Grid> m_tabContainerGrid{ this };
tracker_ref<winrt::FxScrollViewer> m_scrollViewer{ this };
tracker_ref<winrt::Button> m_addButton{ this };
tracker_ref<winrt::ItemsPresenter> m_itemsPresenter{ this };

tracker_ref<winrt::Grid> m_shadowReceiver{ this };

Expand All @@ -178,6 +180,8 @@ class TabView :
winrt::RepeatButton::Click_revoker m_scrollDecreaseClickRevoker{};
winrt::RepeatButton::Click_revoker m_scrollIncreaseClickRevoker{};

winrt::ItemsPresenter::SizeChanged_revoker m_itemsPresenterSizeChangedRevoker{};

DispatcherHelper m_dispatcherHelper{ *this };

winrt::Size previousAvailableSize{};
Expand Down

0 comments on commit 9d841f3

Please sign in to comment.